Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: automate @angular/cli schema.json generation #20221

Merged
merged 1 commit into from Mar 11, 2021
Merged

build: automate @angular/cli schema.json generation #20221

merged 1 commit into from Mar 11, 2021

Conversation

alan-agius4
Copy link
Collaborator

@alan-agius4 alan-agius4 commented Mar 9, 2021

With this change we automate the generation of @angular/cli/lib/config/schema.json. While on paper we could use quicktype for this. Quicktype doesn't handle patternProperties and oneOf that well.

How does this works?
Relative $ref will be resolved and inlined as part of the root schema definitions.

Example

"@schematics/angular:enum": {
    "$ref": "../../../../schematics/angular/enum/schema.json"
},

Will be parsed and transformed to

"@schematics/angular:enum": {
  "$ref": "#/definitions/SchematicsAngularEnumSchema"
},
"definitions: {
  "SchematicsAngularEnumSchema": {
    "title": "Angular Enum Options Schema",
    "type": "object",
    "description": "Generates a new, generic enum definition for the given or default project.",
    "properties": {...}
   }
}
Generated schema.json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "ng-cli://config/schema.json",
  "title": "Angular CLI Workspace Configuration",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string"
    },
    "version": {
      "$ref": "#/definitions/fileVersion"
    },
    "cli": {
      "$ref": "#/definitions/cliOptions"
    },
    "schematics": {
      "$ref": "#/definitions/schematicOptions"
    },
    "newProjectRoot": {
      "type": "string",
      "description": "Path where new projects will be created."
    },
    "defaultProject": {
      "type": "string",
      "description": "Default project name used in commands."
    },
    "projects": {
      "type": "object",
      "patternProperties": {
        "^(?:@[a-zA-Z0-9_-]+/)?[a-zA-Z0-9_-]+$": {
          "$ref": "#/definitions/project"
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false,
  "required": [
    "version"
  ],
  "definitions": {
    "cliOptions": {
      "type": "object",
      "properties": {
        "defaultCollection": {
          "description": "The default schematics collection to use.",
          "type": "string"
        },
        "packageManager": {
          "description": "Specify which package manager tool to use.",
          "type": "string",
          "enum": [
            "npm",
            "cnpm",
            "yarn",
            "pnpm"
          ]
        },
        "warnings": {
          "description": "Control CLI specific console warnings",
          "type": "object",
          "properties": {
            "versionMismatch": {
              "description": "Show a warning when the global version is newer than the local one.",
              "type": "boolean"
            }
          }
        },
        "analytics": {
          "type": [
            "boolean",
            "string"
          ],
          "description": "Share anonymous usage data with the Angular Team at Google."
        },
        "analyticsSharing": {
          "type": "object",
          "properties": {
            "tracking": {
              "description": "Analytics sharing info tracking ID.",
              "type": "string",
              "pattern": "^GA-\\d+-\\d+$"
            },
            "uuid": {
              "description": "Analytics sharing info universally unique identifier.",
              "type": "string"
            }
          }
        }
      },
      "additionalProperties": false
    },
    "schematicOptions": {
      "type": "object",
      "properties": {
        "@schematics/angular:application": {
          "$ref": "#/definitions/SchematicsAngularApplicationSchema"
        },
        "@schematics/angular:class": {
          "$ref": "#/definitions/SchematicsAngularClassSchema"
        },
        "@schematics/angular:component": {
          "$ref": "#/definitions/SchematicsAngularComponentSchema"
        },
        "@schematics/angular:directive": {
          "$ref": "#/definitions/SchematicsAngularDirectiveSchema"
        },
        "@schematics/angular:enum": {
          "$ref": "#/definitions/SchematicsAngularEnumSchema"
        },
        "@schematics/angular:guard": {
          "$ref": "#/definitions/SchematicsAngularGuardSchema"
        },
        "@schematics/angular:interceptor": {
          "$ref": "#/definitions/SchematicsAngularInterceptorSchema"
        },
        "@schematics/angular:interface": {
          "$ref": "#/definitions/SchematicsAngularInterfaceSchema"
        },
        "@schematics/angular:library": {
          "$ref": "#/definitions/SchematicsAngularLibrarySchema"
        },
        "@schematics/angular:pipe": {
          "$ref": "#/definitions/SchematicsAngularPipeSchema"
        },
        "@schematics/angular:ng-new": {
          "$ref": "#/definitions/SchematicsAngularNgNewSchema"
        },
        "@schematics/angular:resolver": {
          "$ref": "#/definitions/SchematicsAngularResolverSchema"
        },
        "@schematics/angular:service": {
          "$ref": "#/definitions/SchematicsAngularServiceSchema"
        },
        "@schematics/angular:web-worker": {
          "$ref": "#/definitions/SchematicsAngularWebWorkerSchema"
        }
      },
      "additionalProperties": {
        "type": "object"
      }
    },
    "fileVersion": {
      "type": "integer",
      "description": "File format version",
      "minimum": 1
    },
    "project": {
      "type": "object",
      "properties": {
        "cli": {
          "$ref": "#/definitions/cliOptions"
        },
        "schematics": {
          "$ref": "#/definitions/schematicOptions"
        },
        "prefix": {
          "type": "string",
          "format": "html-selector",
          "description": "The prefix to apply to generated selectors."
        },
        "root": {
          "type": "string",
          "description": "Root of the project files."
        },
        "i18n": {
          "$ref": "#/definitions/project/definitions/i18n"
        },
        "sourceRoot": {
          "type": "string",
          "description": "The root of the source files, assets and index.html file structure."
        },
        "projectType": {
          "type": "string",
          "description": "Project type.",
          "enum": [
            "application",
            "library"
          ]
        },
        "architect": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/project/definitions/target"
          }
        },
        "targets": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/project/definitions/target"
          }
        }
      },
      "required": [
        "root",
        "projectType"
      ],
      "anyOf": [
        {
          "required": [
            "architect"
          ],
          "not": {
            "required": [
              "targets"
            ]
          }
        },
        {
          "required": [
            "targets"
          ],
          "not": {
            "required": [
              "architect"
            ]
          }
        },
        {
          "not": {
            "required": [
              "targets",
              "architect"
            ]
          }
        }
      ],
      "additionalProperties": false,
      "patternProperties": {
        "^[a-z]{1,3}-.*": {}
      },
      "definitions": {
        "i18n": {
          "description": "Project i18n options",
          "type": "object",
          "properties": {
            "sourceLocale": {
              "oneOf": [
                {
                  "type": "string",
                  "description": "Specifies the source locale of the application.",
                  "default": "en-US",
                  "$comment": "IETF BCP 47 language tag (simplified)",
                  "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-[a-zA-Z]{5,8})?(-x(-[a-zA-Z0-9]{1,8})+)?$"
                },
                {
                  "type": "object",
                  "description": "Localization options to use for the source locale",
                  "properties": {
                    "code": {
                      "type": "string",
                      "description": "Specifies the locale code of the source locale",
                      "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-[a-zA-Z]{5,8})?(-x(-[a-zA-Z0-9]{1,8})+)?$"
                    },
                    "baseHref": {
                      "type": "string",
                      "description": "HTML base HREF to use for the locale (defaults to the locale code)"
                    }
                  },
                  "additionalProperties": false
                }
              ]
            },
            "locales": {
              "type": "object",
              "additionalProperties": false,
              "patternProperties": {
                "^[a-zA-Z]{2,3}(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-[a-zA-Z]{5,8})?(-x(-[a-zA-Z0-9]{1,8})+)?$": {
                  "oneOf": [
                    {
                      "type": "string",
                      "description": "Localization file to use for i18n"
                    },
                    {
                      "type": "array",
                      "description": "Localization files to use for i18n",
                      "items": {
                        "type": "string",
                        "uniqueItems": true
                      }
                    },
                    {
                      "type": "object",
                      "description": "Localization options to use for the locale",
                      "properties": {
                        "translation": {
                          "oneOf": [
                            {
                              "type": "string",
                              "description": "Localization file to use for i18n"
                            },
                            {
                              "type": "array",
                              "description": "Localization files to use for i18n",
                              "items": {
                                "type": "string",
                                "uniqueItems": true
                              }
                            }
                          ]
                        },
                        "baseHref": {
                          "type": "string",
                          "description": "HTML base HREF to use for the locale (defaults to the locale code)"
                        }
                      },
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "additionalProperties": false
        },
        "target": {
          "oneOf": [
            {
              "$comment": "Extendable target with custom builder",
              "type": "object",
              "properties": {
                "builder": {
                  "type": "string",
                  "description": "The builder used for this package.",
                  "not": {
                    "enum": [
                      "@angular-devkit/build-angular:app-shell",
                      "@angular-devkit/build-angular:browser",
                      "@angular-devkit/build-angular:dev-server",
                      "@angular-devkit/build-angular:extract-i18n",
                      "@angular-devkit/build-angular:karma",
                      "@angular-devkit/build-angular:protractor",
                      "@angular-devkit/build-angular:server",
                      "@angular-devkit/build-angular:tslint",
                      "@angular-devkit/build-angular:ng-packagr"
                    ]
                  }
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "type": "object"
                },
                "configurations": {
                  "type": "object",
                  "description": "A map of alternative target options.",
                  "additionalProperties": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "builder"
              ]
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:app-shell"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularAppShellSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularAppShellSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:browser"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:dev-server"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularDevServerSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularDevServerSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:extract-i18n"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularExtractI18nSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularExtractI18nSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:karma"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularKarmaSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularKarmaSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:protractor"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularProtractorSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularProtractorSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:server"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularServerSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularServerSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:tslint"
                },
                "defaultConfiguration": {
                  "type": "string",
                  "description": "A default named configuration to use when a target configuration is not provided."
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularTslintSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularTslintSchema"
                  }
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "builder": {
                  "const": "@angular-devkit/build-angular:ng-packagr"
                },
                "options": {
                  "$ref": "#/definitions/AngularDevkitBuildAngularNgPackagrSchema"
                },
                "configurations": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/definitions/AngularDevkitBuildAngularNgPackagrSchema"
                  }
                }
              }
            }
          ]
        }
      }
    },
    "global": {
      "type": "object",
      "properties": {
        "$schema": {
          "type": "string",
          "format": "uri"
        },
        "version": {
          "$ref": "#/definitions/fileVersion"
        },
        "cli": {
          "$ref": "#/definitions/cliOptions"
        },
        "schematics": {
          "$ref": "#/definitions/schematicOptions"
        }
      },
      "required": [
        "version"
      ]
    },
    "SchematicsAngularApplicationSchema": {
      "title": "Angular Application Options Schema",
      "type": "object",
      "description": "Generates a new basic app definition in the \"projects\" subfolder of the workspace.",
      "properties": {
        "projectRoot": {
          "description": "The root directory of the new app.",
          "type": "string",
          "visible": false
        },
        "name": {
          "description": "The name of the new app.",
          "type": "string",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the application?"
        },
        "inlineStyle": {
          "description": "Include styles inline in the root component.ts file. Only CSS styles can be included inline. Default is false, meaning that an external styles file is created and referenced in the root component.ts file.",
          "type": "boolean",
          "alias": "s",
          "x-user-analytics": 9
        },
        "inlineTemplate": {
          "description": "Include template inline in the root component.ts file. Default is false, meaning that an external template file is created and referenced in the root component.ts file. ",
          "type": "boolean",
          "alias": "t",
          "x-user-analytics": 10
        },
        "viewEncapsulation": {
          "description": "The view encapsulation strategy to use in the new app.",
          "enum": [
            "Emulated",
            "Native",
            "None",
            "ShadowDom"
          ],
          "type": "string",
          "x-user-analytics": 11
        },
        "routing": {
          "type": "boolean",
          "description": "Create a routing NgModule.",
          "default": false,
          "x-prompt": "Would you like to add Angular routing?",
          "x-user-analytics": 17
        },
        "prefix": {
          "type": "string",
          "format": "html-selector",
          "description": "A prefix to apply to generated selectors.",
          "default": "app",
          "alias": "p"
        },
        "style": {
          "description": "The file extension or preprocessor to use for style files.",
          "type": "string",
          "default": "css",
          "enum": [
            "css",
            "scss",
            "sass",
            "less",
            "styl"
          ],
          "x-prompt": {
            "message": "Which stylesheet format would you like to use?",
            "type": "list",
            "items": [
              {
                "value": "css",
                "label": "CSS"
              },
              {
                "value": "scss",
                "label": "SCSS   [ https://sass-lang.com/documentation/syntax#scss                ]"
              },
              {
                "value": "sass",
                "label": "Sass   [ https://sass-lang.com/documentation/syntax#the-indented-syntax ]"
              },
              {
                "value": "less",
                "label": "Less   [ http://lesscss.org                                             ]"
              },
              {
                "value": "styl",
                "label": "Stylus [ https://stylus-lang.com                                        ]"
              }
            ]
          },
          "x-user-analytics": 5
        },
        "skipTests": {
          "description": "Do not create \"spec.ts\" test files for the application.",
          "type": "boolean",
          "default": false,
          "alias": "S",
          "x-user-analytics": 12
        },
        "skipPackageJson": {
          "type": "boolean",
          "default": false,
          "description": "Do not add dependencies to the \"package.json\" file."
        },
        "minimal": {
          "description": "Create a bare-bones project without any testing frameworks. (Use for learning purposes only.)",
          "type": "boolean",
          "default": false,
          "x-user-analytics": 14
        },
        "skipInstall": {
          "description": "Skip installing dependency packages.",
          "type": "boolean",
          "default": false
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the application.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        },
        "strict": {
          "description": "Creates an application with stricter bundle budgets settings.",
          "type": "boolean",
          "default": true,
          "x-user-analytics": 7
        },
        "legacyBrowsers": {
          "type": "boolean",
          "description": "Add support for legacy browsers like Internet Explorer using differential loading.",
          "default": false
        }
      }
    },
    "SchematicsAngularClassSchema": {
      "title": "Angular Class Options Schema",
      "type": "object",
      "description": "Creates a new generic class definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the new class.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the class?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the class, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new class.",
          "default": false,
          "x-user-analytics": 12
        },
        "type": {
          "type": "string",
          "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\".",
          "default": ""
        },
        "lintFix": {
          "type": "boolean",
          "default": false,
          "description": "Apply lint fixes after generating the class.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularComponentSchema": {
      "title": "Angular Component Options Schema",
      "type": "object",
      "description": "Creates a new generic component definition in the given or default project.",
      "properties": {
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the component file, relative to the current workspace. Default is a folder with the same name as the component in the project root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "name": {
          "type": "string",
          "description": "The name of the component.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the component?"
        },
        "displayBlock": {
          "description": "Specifies if the style will contain `:host { display: block; }`.",
          "type": "boolean",
          "default": false,
          "alias": "b"
        },
        "inlineStyle": {
          "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file.",
          "type": "boolean",
          "default": false,
          "alias": "s",
          "x-user-analytics": 9
        },
        "inlineTemplate": {
          "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file.",
          "type": "boolean",
          "default": false,
          "alias": "t",
          "x-user-analytics": 10
        },
        "viewEncapsulation": {
          "description": "The view encapsulation strategy to use in the new component.",
          "enum": [
            "Emulated",
            "Native",
            "None",
            "ShadowDom"
          ],
          "type": "string",
          "alias": "v",
          "x-user-analytics": 11
        },
        "changeDetection": {
          "description": "The change detection strategy to use in the new component.",
          "enum": [
            "Default",
            "OnPush"
          ],
          "type": "string",
          "default": "Default",
          "alias": "c"
        },
        "prefix": {
          "type": "string",
          "description": "The prefix to apply to the generated component selector.",
          "alias": "p",
          "oneOf": [
            {
              "maxLength": 0
            },
            {
              "minLength": 1,
              "format": "html-selector"
            }
          ]
        },
        "style": {
          "description": "The file extension or preprocessor to use for style files.",
          "type": "string",
          "default": "css",
          "enum": [
            "css",
            "scss",
            "sass",
            "less",
            "styl"
          ],
          "x-user-analytics": 5
        },
        "type": {
          "type": "string",
          "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\".",
          "default": "Component"
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new component.",
          "default": false,
          "x-user-analytics": 12
        },
        "flat": {
          "type": "boolean",
          "description": "Create the new files at the top level of the current project.",
          "default": false
        },
        "skipImport": {
          "type": "boolean",
          "description": "Do not import this component into the owning NgModule.",
          "default": false,
          "x-user-analytics": 18
        },
        "selector": {
          "type": "string",
          "format": "html-selector",
          "description": "The HTML selector to use for this component."
        },
        "skipSelector": {
          "type": "boolean",
          "default": false,
          "description": "Specifies if the component should have a selector or not."
        },
        "module": {
          "type": "string",
          "description": "The declaring NgModule.",
          "alias": "m"
        },
        "export": {
          "type": "boolean",
          "default": false,
          "description": "The declaring NgModule exports this component.",
          "x-user-analytics": 19
        },
        "entryComponent": {
          "type": "boolean",
          "default": false,
          "description": "The new component is the entry component of the declaring NgModule.",
          "x-deprecated": "Since version 9.0.0 with Ivy, entryComponents is no longer necessary."
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the component.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularDirectiveSchema": {
      "title": "Angular Directive Options Schema",
      "type": "object",
      "description": "Creates a new generic directive definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the new directive.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the directive?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the interface that defines the directive, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "prefix": {
          "type": "string",
          "description": "A prefix to apply to generated selectors.",
          "alias": "p",
          "oneOf": [
            {
              "maxLength": 0
            },
            {
              "minLength": 1,
              "format": "html-selector"
            }
          ]
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new class.",
          "default": false,
          "x-user-analytics": 12
        },
        "skipImport": {
          "type": "boolean",
          "description": "Do not import this directive into the owning NgModule.",
          "default": false,
          "x-user-analytics": 18
        },
        "selector": {
          "type": "string",
          "format": "html-selector",
          "description": "The HTML selector to use for this directive."
        },
        "flat": {
          "type": "boolean",
          "description": "When true (the default), creates the new files at the top level of the current project.",
          "default": true
        },
        "module": {
          "type": "string",
          "description": "The declaring NgModule.",
          "alias": "m"
        },
        "export": {
          "type": "boolean",
          "default": false,
          "description": "The declaring NgModule exports this directive.",
          "x-user-analytics": 19
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the directive.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularEnumSchema": {
      "title": "Angular Enum Options Schema",
      "type": "object",
      "description": "Generates a new, generic enum definition for the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the enum.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the enum?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the enum definition, relative to the current workspace.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project in which to create the enum. Default is the configured default project for the workspace.",
          "$default": {
            "$source": "projectName"
          }
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the enum.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularGuardSchema": {
      "title": "Angular Guard Options Schema",
      "type": "object",
      "description": "Generates a new, generic route guard definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the new route guard.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the guard?"
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new guard.",
          "default": false,
          "x-user-analytics": 12
        },
        "flat": {
          "type": "boolean",
          "description": "When true (the default), creates the new files at the top level of the current project.",
          "default": true
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the interface that defines the guard, relative to the current workspace.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the guard.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        },
        "implements": {
          "type": "array",
          "description": "Specifies which interfaces to implement.",
          "uniqueItems": true,
          "minItems": 1,
          "items": {
            "enum": [
              "CanActivate",
              "CanActivateChild",
              "CanDeactivate",
              "CanLoad"
            ],
            "type": "string"
          },
          "default": [
            "CanActivate"
          ],
          "x-prompt": "Which interfaces would you like to implement?"
        }
      }
    },
    "SchematicsAngularInterceptorSchema": {
      "title": "Angular Interceptor Options Schema",
      "type": "object",
      "description": "Creates a new, generic interceptor definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the interceptor.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the interceptor?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the interceptor, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "flat": {
          "type": "boolean",
          "default": true,
          "description": "When true (the default), creates files at the top level of the project."
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new interceptor.",
          "default": false,
          "x-user-analytics": 12
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the interceptor.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularInterfaceSchema": {
      "title": "Angular Interface Options Schema",
      "type": "object",
      "description": "Creates a new generic interface definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the interface.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the interface?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the interface, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "prefix": {
          "type": "string",
          "default": "",
          "description": "A prefix to apply to generated selectors."
        },
        "type": {
          "type": "string",
          "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\".",
          "$default": {
            "$source": "argv",
            "index": 1
          }
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the interface.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularLibrarySchema": {
      "title": "Library Options Schema",
      "type": "object",
      "description": "Creates a new generic library project in the current workspace.",
      "long-description": "./library-long.md",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the library.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the library?"
        },
        "entryFile": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the library's public API file, relative to the workspace root.",
          "default": "public-api"
        },
        "prefix": {
          "type": "string",
          "format": "html-selector",
          "description": "A prefix to apply to generated selectors.",
          "default": "lib",
          "alias": "p"
        },
        "skipPackageJson": {
          "type": "boolean",
          "default": false,
          "description": "Do not add dependencies to the \"package.json\" file. "
        },
        "skipInstall": {
          "description": "Do not install dependency packages.",
          "type": "boolean",
          "default": false
        },
        "skipTsConfig": {
          "type": "boolean",
          "default": false,
          "description": "Do not update \"tsconfig.json\" to add a path mapping for the new library. The path mapping is needed to use the library in an app, but can be disabled here to simplify development."
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the library.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularPipeSchema": {
      "title": "Angular Pipe Options Schema",
      "type": "object",
      "description": "Creates a new generic pipe definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the pipe.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the pipe?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the pipe, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "flat": {
          "type": "boolean",
          "default": true,
          "description": "When true (the default) creates files at the top level of the project."
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new pipe.",
          "default": false,
          "x-user-analytics": 12
        },
        "skipImport": {
          "type": "boolean",
          "default": false,
          "description": "Do not import this pipe into the owning NgModule.",
          "x-user-analytics": 18
        },
        "module": {
          "type": "string",
          "description": "The declaring NgModule.",
          "alias": "m"
        },
        "export": {
          "type": "boolean",
          "default": false,
          "description": "The declaring NgModule exports this pipe.",
          "x-user-analytics": 19
        },
        "lintFix": {
          "type": "boolean",
          "default": false,
          "description": "Apply lint fixes after generating the pipe.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularNgNewSchema": {
      "title": "Angular Ng New Options Schema",
      "type": "object",
      "properties": {
        "directory": {
          "type": "string",
          "description": "The directory name to create the workspace in."
        },
        "name": {
          "description": "The name of the new workspace and initial project.",
          "type": "string",
          "format": "html-selector",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the new workspace and initial project?"
        },
        "skipInstall": {
          "description": "Do not install dependency packages.",
          "type": "boolean",
          "default": false
        },
        "linkCli": {
          "description": "Link the CLI to the global version (internal development only).",
          "type": "boolean",
          "default": false,
          "visible": false
        },
        "skipGit": {
          "description": "Do not initialize a git repository.",
          "type": "boolean",
          "default": false,
          "alias": "g"
        },
        "commit": {
          "description": "Initial git repository commit information.",
          "oneOf": [
            {
              "type": "boolean"
            },
            {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "email": {
                  "type": "string",
                  "format": "email"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          ],
          "default": true
        },
        "newProjectRoot": {
          "description": "The path where new projects will be created, relative to the new workspace root.",
          "type": "string",
          "default": "projects"
        },
        "inlineStyle": {
          "description": "Include styles inline in the component TS file. By default, an external styles file is created and referenced in the component TypeScript file.",
          "type": "boolean",
          "alias": "s",
          "x-user-analytics": 9
        },
        "inlineTemplate": {
          "description": "Include template inline in the component TS file. By default, an external template file is created and referenced in the component TypeScript file.",
          "type": "boolean",
          "alias": "t",
          "x-user-analytics": 10
        },
        "viewEncapsulation": {
          "description": "The view encapsulation strategy to use in the initial project.",
          "enum": [
            "Emulated",
            "Native",
            "None",
            "ShadowDom"
          ],
          "type": "string",
          "x-user-analytics": 11
        },
        "version": {
          "type": "string",
          "description": "The version of the Angular CLI to use.",
          "visible": false,
          "$default": {
            "$source": "ng-cli-version"
          }
        },
        "routing": {
          "type": "boolean",
          "description": "Generate a routing module for the initial project.",
          "x-user-analytics": 17
        },
        "prefix": {
          "type": "string",
          "format": "html-selector",
          "description": "The prefix to apply to generated selectors for the initial project.",
          "minLength": 1,
          "default": "app",
          "alias": "p"
        },
        "style": {
          "description": "The file extension or preprocessor to use for style files.",
          "type": "string",
          "enum": [
            "css",
            "scss",
            "sass",
            "less",
            "styl"
          ],
          "x-user-analytics": 5
        },
        "skipTests": {
          "description": "Do not generate \"spec.ts\" test files for the new project.",
          "type": "boolean",
          "default": false,
          "alias": "S",
          "x-user-analytics": 12
        },
        "createApplication": {
          "description": "Create a new initial application project in the 'src' folder of the new workspace. When false, creates an empty workspace with no initial application. You can then use the generate application command so that all applications are created in the projects folder.",
          "type": "boolean",
          "default": true
        },
        "minimal": {
          "description": "Create a workspace without any testing frameworks. (Use for learning purposes only.)",
          "type": "boolean",
          "default": false,
          "x-user-analytics": 14
        },
        "strict": {
          "description": "Creates a workspace with stricter type checking and stricter bundle budgets settings. This setting helps improve maintainability and catch bugs ahead of time. For more information, see https://angular.io/guide/strict-mode",
          "type": "boolean",
          "default": true,
          "x-user-analytics": 7
        },
        "legacyBrowsers": {
          "type": "boolean",
          "description": "Add support for legacy browsers like Internet Explorer using differential loading.",
          "default": false
        },
        "packageManager": {
          "description": "The package manager used to install dependencies.",
          "type": "string",
          "enum": [
            "npm",
            "yarn",
            "pnpm",
            "cnpm"
          ]
        }
      }
    },
    "SchematicsAngularResolverSchema": {
      "title": "Angular resolver Options Schema",
      "type": "object",
      "description": "Generates a new, generic resolver definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the new resolver.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the resolver?"
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new resolver.",
          "default": false,
          "x-user-analytics": 12
        },
        "flat": {
          "type": "boolean",
          "description": "When true (the default), creates the new files at the top level of the current project.",
          "default": true
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the interface that defines the resolver, relative to the current workspace.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        }
      }
    },
    "SchematicsAngularServiceSchema": {
      "title": "Angular Service Options Schema",
      "type": "object",
      "description": "Creates a new, generic service definition in the given or default project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the service.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the service?"
        },
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the service, relative to the workspace root.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "flat": {
          "type": "boolean",
          "default": true,
          "description": "When true (the default), creates files at the top level of the project."
        },
        "skipTests": {
          "type": "boolean",
          "description": "Do not create \"spec.ts\" test files for the new service.",
          "default": false,
          "x-user-analytics": 12
        },
        "lintFix": {
          "type": "boolean",
          "description": "Apply lint fixes after generating the service.",
          "x-user-analytics": 15,
          "x-deprecated": "Use \"ng lint --fix\" directly instead."
        }
      }
    },
    "SchematicsAngularWebWorkerSchema": {
      "title": "Angular Web Worker Options Schema",
      "type": "object",
      "description": "Creates a new generic web worker definition in the given or default project.",
      "properties": {
        "path": {
          "type": "string",
          "format": "path",
          "description": "The path at which to create the worker file, relative to the current workspace.",
          "visible": false
        },
        "project": {
          "type": "string",
          "description": "The name of the project.",
          "$default": {
            "$source": "projectName"
          }
        },
        "target": {
          "type": "string",
          "description": "The target to apply web worker to.",
          "default": "build"
        },
        "name": {
          "type": "string",
          "description": "The name of the worker.",
          "$default": {
            "$source": "argv",
            "index": 0
          },
          "x-prompt": "What name would you like to use for the worker?"
        },
        "snippet": {
          "type": "boolean",
          "default": true,
          "description": "Add a worker creation snippet in a sibling file of the same name."
        }
      }
    },
    "AngularDevkitBuildAngularAppShellSchema": {
      "title": "App Shell Target",
      "description": "App Shell target options for Build Facade.",
      "type": "object",
      "properties": {
        "browserTarget": {
          "type": "string",
          "description": "A browser builder target use for rendering the app shell in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.",
          "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
        },
        "serverTarget": {
          "type": "string",
          "description": "A server builder target use for rendering the app shell in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.",
          "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
        },
        "appModuleBundle": {
          "type": "string",
          "description": "Script that exports the Server AppModule to render. This should be the main JavaScript outputted by the server target. By default we will resolve the outputPath of the serverTarget and find a bundle named 'main' in it (whether or not there's a hash tag)."
        },
        "route": {
          "type": "string",
          "description": "The route to render.",
          "default": "/"
        },
        "inputIndexPath": {
          "type": "string",
          "description": "The input path for the index.html file. By default uses the output index.html of the browser target."
        },
        "outputIndexPath": {
          "type": "string",
          "description": "The output path of the index.html file. By default will overwrite the input file."
        }
      },
      "additionalProperties": false
    },
    "AngularDevkitBuildAngularBrowserSchema": {
      "title": "Webpack browser schema for Build Facade.",
      "description": "Browser target options",
      "type": "object",
      "properties": {
        "assets": {
          "type": "array",
          "description": "List of static application assets.",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema/definitions/assetPattern"
          }
        },
        "main": {
          "type": "string",
          "description": "The full path for the main entry point to the app, relative to the current workspace.",
          "$valueDescription": "fileName"
        },
        "polyfills": {
          "type": "string",
          "description": "The full path for the polyfills file, relative to the current workspace."
        },
        "tsConfig": {
          "type": "string",
          "description": "The full path for the TypeScript configuration file, relative to the current workspace."
        },
        "scripts": {
          "description": "Global scripts to be included in the build.",
          "type": "array",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema/definitions/extraEntryPoint"
          }
        },
        "styles": {
          "description": "Global styles to be included in the build.",
          "type": "array",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema/definitions/extraEntryPoint"
          }
        },
        "stylePreprocessorOptions": {
          "description": "Options to pass to style preprocessors.",
          "type": "object",
          "properties": {
            "includePaths": {
              "description": "Paths to include. Paths will be resolved to project root.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "default": []
            }
          },
          "additionalProperties": false
        },
        "optimization": {
          "description": "Enables optimization of the build output. Including minification of scripts and styles, tree-shaking, dead-code elimination, inlining of critical CSS and fonts inlining. For more information, see https://angular.io/guide/workspace-config#optimization-configuration.",
          "x-user-analytics": 16,
          "default": false,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Enables optimization of the scripts output.",
                  "default": true
                },
                "styles": {
                  "description": "Enables optimization of the styles output.",
                  "default": true,
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "minify": {
                          "type": "boolean",
                          "description": "Minify CSS definitions by removing extraneous whitespace and comments, merging identifiers and minimizing values.",
                          "default": true
                        },
                        "inlineCritical": {
                          "type": "boolean",
                          "description": "Extract and inline critical CSS definitions to improve first paint time.",
                          "default": true
                        }
                      },
                      "additionalProperties": false
                    },
                    {
                      "type": "boolean"
                    }
                  ]
                },
                "fonts": {
                  "description": "Enables optimization for fonts. This option requires internet access. `HTTPS_PROXY` environment variable can be used to specify a proxy server.",
                  "default": true,
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "inline": {
                          "type": "boolean",
                          "description": "Reduce render blocking requests by inlining external Google fonts and icons CSS definitions in the application's HTML index file. This option requires internet access. `HTTPS_PROXY` environment variable can be used to specify a proxy server.",
                          "default": true
                        }
                      },
                      "additionalProperties": false
                    },
                    {
                      "type": "boolean"
                    }
                  ]
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ]
        },
        "fileReplacements": {
          "description": "Replace compilation source files with other compilation source files in the build.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema/definitions/fileReplacement"
          },
          "default": []
        },
        "outputPath": {
          "type": "string",
          "description": "The full path for the new output directory, relative to the current workspace.\n\nBy default, writes output to a folder named dist/ in the current project."
        },
        "resourcesOutputPath": {
          "type": "string",
          "description": "The path where style resources will be placed, relative to outputPath.",
          "default": ""
        },
        "aot": {
          "type": "boolean",
          "description": "Build using Ahead of Time compilation.",
          "x-user-analytics": 13,
          "default": false
        },
        "sourceMap": {
          "description": "Output source maps for scripts and styles. For more information, see https://angular.io/guide/workspace-config#source-map-configuration.",
          "default": true,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Output source maps for all scripts.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Output source maps for all styles.",
                  "default": true
                },
                "hidden": {
                  "type": "boolean",
                  "description": "Output source maps used for error reporting tools.",
                  "default": false
                },
                "vendor": {
                  "type": "boolean",
                  "description": "Resolve vendor packages source maps.",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ]
        },
        "vendorChunk": {
          "type": "boolean",
          "description": "Generate a seperate bundle containing only vendor libraries. This option should only used for development.",
          "default": true
        },
        "commonChunk": {
          "type": "boolean",
          "description": "Generate a seperate bundle containing code used across multiple bundles.",
          "default": true
        },
        "baseHref": {
          "type": "string",
          "description": "Base url for the application being built."
        },
        "deployUrl": {
          "type": "string",
          "description": "URL where files will be deployed."
        },
        "verbose": {
          "type": "boolean",
          "description": "Adds more details to output logging.",
          "default": false
        },
        "progress": {
          "type": "boolean",
          "description": "Log progress to the console while building.",
          "default": true
        },
        "i18nFile": {
          "type": "string",
          "description": "Localization file to use for i18n.",
          "x-deprecated": "Use 'locales' object in the project metadata instead."
        },
        "i18nFormat": {
          "type": "string",
          "description": "Format of the localization file specified with --i18n-file.",
          "x-deprecated": "No longer needed as the format will be determined automatically."
        },
        "i18nLocale": {
          "type": "string",
          "description": "Locale to use for i18n.",
          "x-deprecated": "Use 'localize' instead."
        },
        "i18nMissingTranslation": {
          "type": "string",
          "description": "How to handle missing translations for i18n.",
          "enum": [
            "warning",
            "error",
            "ignore"
          ],
          "default": "warning"
        },
        "localize": {
          "description": "Translate the bundles in one or more locales.",
          "oneOf": [
            {
              "type": "boolean",
              "description": "Translate all locales."
            },
            {
              "type": "array",
              "description": "List of locales ID's to translate.",
              "minItems": 1,
              "items": {
                "type": "string",
                "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-[a-zA-Z]{5,8})?(-x(-[a-zA-Z0-9]{1,8})+)?$"
              }
            }
          ]
        },
        "extractCss": {
          "type": "boolean",
          "description": "Extract CSS from global styles into '.css' files instead of '.js'.",
          "default": true,
          "x-deprecated": "Deprecated since version 11.0. No longer required to disable CSS extraction for HMR."
        },
        "watch": {
          "type": "boolean",
          "description": "Run build when files change.",
          "default": false
        },
        "outputHashing": {
          "type": "string",
          "description": "Define the output filename cache-busting hashing mode.",
          "default": "none",
          "enum": [
            "none",
            "all",
            "media",
            "bundles"
          ]
        },
        "poll": {
          "type": "number",
          "description": "Enable and define the file watching poll time period in milliseconds."
        },
        "deleteOutputPath": {
          "type": "boolean",
          "description": "Delete the output path before building.",
          "default": true
        },
        "preserveSymlinks": {
          "type": "boolean",
          "description": "Do not use the real path when resolving modules. If unset then will default to `true` if NodeJS option --preserve-symlinks is set."
        },
        "extractLicenses": {
          "type": "boolean",
          "description": "Extract all licenses in a separate file.",
          "default": false
        },
        "showCircularDependencies": {
          "type": "boolean",
          "description": "Show circular dependency warnings on builds.",
          "default": true
        },
        "buildOptimizer": {
          "type": "boolean",
          "description": "Enables '@angular-devkit/build-optimizer' optimizations when using the 'aot' option.",
          "default": false
        },
        "namedChunks": {
          "type": "boolean",
          "description": "Use file name for lazy loaded chunks.",
          "default": true
        },
        "subresourceIntegrity": {
          "type": "boolean",
          "description": "Enables the use of subresource integrity validation.",
          "default": false
        },
        "serviceWorker": {
          "type": "boolean",
          "description": "Generates a service worker config for production builds.",
          "default": false
        },
        "ngswConfigPath": {
          "type": "string",
          "description": "Path to ngsw-config.json."
        },
        "index": {
          "description": "Configures the generation of the application's HTML index.",
          "oneOf": [
            {
              "type": "string",
              "description": "The path of a file to use for the application's HTML index. The filename of the specified path will be used for the generated file and will be created in the root of the application's configured output path."
            },
            {
              "type": "object",
              "description": "",
              "properties": {
                "input": {
                  "type": "string",
                  "minLength": 1,
                  "description": "The path of a file to use for the application's generated HTML index."
                },
                "output": {
                  "type": "string",
                  "minLength": 1,
                  "default": "index.html",
                  "description": "The output path of the application's generated HTML index file. The full provided path will be used and will be considered relative to the application's configured output path."
                }
              }
            }
          ]
        },
        "statsJson": {
          "type": "boolean",
          "description": "Generates a 'stats.json' file which can be analyzed using tools such as 'webpack-bundle-analyzer'.",
          "default": false
        },
        "forkTypeChecker": {
          "type": "boolean",
          "description": "Run the TypeScript type checker in a forked process.",
          "default": true
        },
        "lazyModules": {
          "description": "List of additional NgModule files that will be lazy loaded. Lazy router modules will be discovered automatically.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "x-deprecated": "'SystemJsNgModuleLoader' is deprecated, and this is part of its usage. Use 'import()' syntax instead.",
          "default": []
        },
        "budgets": {
          "description": "Budget thresholds to ensure parts of your application stay within boundaries which you set.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularBrowserSchema/definitions/budget"
          },
          "default": []
        },
        "webWorkerTsConfig": {
          "type": "string",
          "description": "TypeScript configuration for Web Worker modules."
        },
        "crossOrigin": {
          "type": "string",
          "description": "Define the crossorigin attribute setting of elements that provide CORS support.",
          "default": "none",
          "enum": [
            "none",
            "anonymous",
            "use-credentials"
          ]
        },
        "allowedCommonJsDependencies": {
          "description": "A list of CommonJS packages that are allowed to be used without a build time warning.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "default": []
        }
      },
      "additionalProperties": false,
      "definitions": {
        "assetPattern": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "followSymlinks": {
                  "type": "boolean",
                  "default": false,
                  "description": "Allow glob patterns to follow symlink directories. This allows subdirectories of the symlink to be searched."
                },
                "glob": {
                  "type": "string",
                  "description": "The pattern to match."
                },
                "input": {
                  "type": "string",
                  "description": "The input directory path in which to apply 'glob'. Defaults to the project root."
                },
                "ignore": {
                  "description": "An array of globs to ignore.",
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "output": {
                  "type": "string",
                  "description": "Absolute path within the output."
                }
              },
              "additionalProperties": false
            },
            {
              "type": "string"
            }
          ]
        },
        "fileReplacement": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "src": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                },
                "replaceWith": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "replace": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                },
                "with": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                }
              },
              "additionalProperties": false
            }
          ]
        },
        "extraEntryPoint": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "input": {
                  "type": "string",
                  "description": "The file to include."
                },
                "bundleName": {
                  "type": "string",
                  "description": "The bundle name for this extra entry point."
                },
                "inject": {
                  "type": "boolean",
                  "description": "If the bundle will be referenced in the HTML file.",
                  "default": true
                }
              },
              "additionalProperties": false
            },
            {
              "type": "string",
              "description": "The file to include."
            }
          ]
        },
        "budget": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "description": "The type of budget.",
              "enum": [
                "all",
                "allScript",
                "any",
                "anyScript",
                "anyComponentStyle",
                "bundle",
                "initial"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name of the bundle."
            },
            "baseline": {
              "type": "string",
              "description": "The baseline size for comparison."
            },
            "maximumWarning": {
              "type": "string",
              "description": "The maximum threshold for warning relative to the baseline."
            },
            "maximumError": {
              "type": "string",
              "description": "The maximum threshold for error relative to the baseline."
            },
            "minimumWarning": {
              "type": "string",
              "description": "The minimum threshold for warning relative to the baseline."
            },
            "minimumError": {
              "type": "string",
              "description": "The minimum threshold for error relative to the baseline."
            },
            "warning": {
              "type": "string",
              "description": "The threshold for warning relative to the baseline (min & max)."
            },
            "error": {
              "type": "string",
              "description": "The threshold for error relative to the baseline (min & max)."
            }
          },
          "additionalProperties": false
        }
      }
    },
    "AngularDevkitBuildAngularDevServerSchema": {
      "title": "Dev Server Target",
      "description": "Dev Server target options for Build Facade.",
      "type": "object",
      "properties": {
        "browserTarget": {
          "type": "string",
          "description": "A browser builder target to serve in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.",
          "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
        },
        "port": {
          "type": "number",
          "description": "Port to listen on.",
          "default": 4200
        },
        "host": {
          "type": "string",
          "description": "Host to listen on.",
          "default": "localhost"
        },
        "proxyConfig": {
          "type": "string",
          "description": "Proxy configuration file."
        },
        "ssl": {
          "type": "boolean",
          "description": "Serve using HTTPS.",
          "default": false
        },
        "sslKey": {
          "type": "string",
          "description": "SSL key to use for serving HTTPS."
        },
        "sslCert": {
          "type": "string",
          "description": "SSL certificate to use for serving HTTPS."
        },
        "headers": {
          "type": "object",
          "description": "Custom HTTP headers to be added to all responses.",
          "propertyNames": {
            "pattern": "^[-_A-Za-z0-9]+$"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "open": {
          "type": "boolean",
          "description": "Opens the url in default browser.",
          "default": false,
          "alias": "o"
        },
        "verbose": {
          "type": "boolean",
          "description": "Adds more details to output logging."
        },
        "liveReload": {
          "type": "boolean",
          "description": "Whether to reload the page on change, using live-reload.",
          "default": true
        },
        "publicHost": {
          "type": "string",
          "description": "The URL that the browser client (or live-reload client, if enabled) should use to connect to the development server. Use for a complex dev server setup, such as one with reverse proxies."
        },
        "allowedHosts": {
          "type": "array",
          "description": "List of hosts that are allowed to access the dev server.",
          "default": [],
          "items": {
            "type": "string"
          }
        },
        "servePath": {
          "type": "string",
          "description": "The pathname where the app will be served."
        },
        "disableHostCheck": {
          "type": "boolean",
          "description": "Don't verify connected clients are part of allowed hosts.",
          "default": false
        },
        "hmr": {
          "type": "boolean",
          "description": "Enable hot module replacement.",
          "default": false
        },
        "watch": {
          "type": "boolean",
          "description": "Rebuild on change.",
          "default": true
        },
        "hmrWarning": {
          "type": "boolean",
          "description": "Show a warning when the --hmr option is enabled.",
          "default": true,
          "x-deprecated": "No longer has an effect."
        },
        "servePathDefaultWarning": {
          "type": "boolean",
          "description": "Show a warning when deploy-url/base-href use unsupported serve path values.",
          "default": true,
          "x-deprecated": "No longer has an effect."
        },
        "optimization": {
          "description": "Enables optimization of the build output. Including minification of scripts and styles, tree-shaking, dead-code elimination, tree-shaking and fonts inlining. For more information, see https://angular.io/guide/workspace-config#optimization-configuration.",
          "x-user-analytics": 16,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Enables optimization of the scripts output.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Enables optimization of the styles output.",
                  "default": true
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ],
          "x-deprecated": "Use the \"optimization\" option in the browser builder instead."
        },
        "aot": {
          "type": "boolean",
          "description": "Build using Ahead of Time compilation.",
          "x-user-analytics": 13,
          "x-deprecated": "Use the \"aot\" option in the browser builder instead."
        },
        "sourceMap": {
          "description": "Output source maps for scripts and styles. For more information, see https://angular.io/guide/workspace-config#source-map-configuration.",
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Output source maps for all scripts.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Output source maps for all styles.",
                  "default": true
                },
                "hidden": {
                  "type": "boolean",
                  "description": "Output source maps used for error reporting tools.",
                  "default": false
                },
                "vendor": {
                  "type": "boolean",
                  "description": "Resolve vendor packages source maps.",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ],
          "x-deprecated": "Use the \"sourceMap\" option in the browser builder instead."
        },
        "vendorChunk": {
          "type": "boolean",
          "description": "Generate a seperate bundle containing only vendor libraries. This option should only used for development.",
          "x-deprecated": "Use the \"vendorChunk\" option in the browser builder instead."
        },
        "commonChunk": {
          "type": "boolean",
          "description": "Generate a seperate bundle containing code used across multiple bundles.",
          "x-deprecated": "Use the \"commonChunk\" option in the browser builder instead."
        },
        "baseHref": {
          "type": "string",
          "description": "Base url for the application being built.",
          "x-deprecated": "Use the \"baseHref\" option in the browser builder instead."
        },
        "deployUrl": {
          "type": "string",
          "description": "URL where files will be deployed.",
          "x-deprecated": "Use the \"deployUrl\" option in the browser builder instead."
        },
        "progress": {
          "type": "boolean",
          "description": "Log progress to the console while building.",
          "x-deprecated": "Use the \"progress\" option in the browser builder instead."
        },
        "poll": {
          "type": "number",
          "description": "Enable and define the file watching poll time period in milliseconds."
        }
      },
      "additionalProperties": false
    },
    "AngularDevkitBuildAngularExtractI18nSchema": {
      "title": "Extract i18n Target",
      "description": "Extract i18n target options for Build Facade.",
      "type": "object",
      "properties": {
        "browserTarget": {
          "type": "string",
          "description": "A browser builder target to extract i18n messages in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.",
          "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
        },
        "format": {
          "type": "string",
          "description": "Output format for the generated file.",
          "default": "xlf",
          "enum": [
            "xmb",
            "xlf",
            "xlif",
            "xliff",
            "xlf2",
            "xliff2",
            "json",
            "arb"
          ]
        },
        "i18nFormat": {
          "type": "string",
          "description": "Output format for the generated file.",
          "default": "xlf",
          "x-deprecated": "Use 'format' option instead.",
          "enum": [
            "xmb",
            "xlf",
            "xlif",
            "xliff",
            "xlf2",
            "xliff2",
            "json",
            "arb"
          ]
        },
        "i18nLocale": {
          "type": "string",
          "description": "Specifies the source language of the application.",
          "x-deprecated": "Use 'i18n' project level sub-option 'sourceLocale' instead."
        },
        "ivy": {
          "type": "boolean",
          "description": "Use Ivy compiler to extract translations. The default for Ivy applications."
        },
        "progress": {
          "type": "boolean",
          "description": "Log progress to the console.",
          "default": true
        },
        "outputPath": {
          "type": "string",
          "description": "Path where output will be placed."
        },
        "outFile": {
          "type": "string",
          "description": "Name of the file to output."
        }
      },
      "additionalProperties": false
    },
    "AngularDevkitBuildAngularKarmaSchema": {
      "title": "Karma Target",
      "description": "Karma target options for Build Facade.",
      "type": "object",
      "properties": {
        "main": {
          "type": "string",
          "description": "The name of the main entry-point file."
        },
        "tsConfig": {
          "type": "string",
          "description": "The name of the TypeScript configuration file."
        },
        "karmaConfig": {
          "type": "string",
          "description": "The name of the Karma configuration file."
        },
        "polyfills": {
          "type": "string",
          "description": "The name of the polyfills file."
        },
        "assets": {
          "type": "array",
          "description": "List of static application assets.",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularKarmaSchema/definitions/assetPattern"
          }
        },
        "scripts": {
          "description": "Global scripts to be included in the build.",
          "type": "array",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularKarmaSchema/definitions/extraEntryPoint"
          }
        },
        "styles": {
          "description": "Global styles to be included in the build.",
          "type": "array",
          "default": [],
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularKarmaSchema/definitions/extraEntryPoint"
          }
        },
        "stylePreprocessorOptions": {
          "description": "Options to pass to style preprocessors",
          "type": "object",
          "properties": {
            "includePaths": {
              "description": "Paths to include. Paths will be resolved to project root.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "default": []
            }
          },
          "additionalProperties": false
        },
        "include": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Globs of files to include, relative to workspace or project root. \nThere are 2 special cases:\n - when a path to directory is provided, all spec files ending \".spec.@(ts|tsx)\" will be included\n - when a path to a file is provided, and a matching spec file exists it will be included instead"
        },
        "sourceMap": {
          "description": "Output source maps for scripts and styles. For more information, see https://angular.io/guide/workspace-config#source-map-configuration.",
          "default": true,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Output source maps for all scripts.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Output source maps for all styles.",
                  "default": true
                },
                "vendor": {
                  "type": "boolean",
                  "description": "Resolve vendor packages source maps.",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ]
        },
        "progress": {
          "type": "boolean",
          "description": "Log progress to the console while building.",
          "default": true
        },
        "watch": {
          "type": "boolean",
          "description": "Run build when files change."
        },
        "poll": {
          "type": "number",
          "description": "Enable and define the file watching poll time period in milliseconds."
        },
        "preserveSymlinks": {
          "type": "boolean",
          "description": "Do not use the real path when resolving modules. If unset then will default to `true` if NodeJS option --preserve-symlinks is set."
        },
        "browsers": {
          "type": "string",
          "description": "Override which browsers tests are run against."
        },
        "codeCoverage": {
          "type": "boolean",
          "description": "Output a code coverage report.",
          "default": false
        },
        "codeCoverageExclude": {
          "type": "array",
          "description": "Globs to exclude from code coverage.",
          "items": {
            "type": "string"
          },
          "default": []
        },
        "fileReplacements": {
          "description": "Replace compilation source files with other compilation source files in the build.",
          "type": "array",
          "items": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "src": {
                    "type": "string"
                  },
                  "replaceWith": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "replace": {
                    "type": "string"
                  },
                  "with": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "default": []
        },
        "reporters": {
          "type": "array",
          "description": "Karma reporters to use. Directly passed to the karma runner.",
          "items": {
            "type": "string"
          }
        },
        "webWorkerTsConfig": {
          "type": "string",
          "description": "TypeScript configuration for Web Worker modules."
        }
      },
      "additionalProperties": false,
      "definitions": {
        "assetPattern": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "glob": {
                  "type": "string",
                  "description": "The pattern to match."
                },
                "input": {
                  "type": "string",
                  "description": "The input directory path in which to apply 'glob'. Defaults to the project root."
                },
                "output": {
                  "type": "string",
                  "description": "Absolute path within the output."
                },
                "ignore": {
                  "description": "An array of globs to ignore.",
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "additionalProperties": false
            },
            {
              "type": "string"
            }
          ]
        },
        "extraEntryPoint": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "input": {
                  "type": "string",
                  "description": "The file to include."
                },
                "bundleName": {
                  "type": "string",
                  "description": "The bundle name for this extra entry point."
                },
                "inject": {
                  "type": "boolean",
                  "description": "If the bundle will be referenced in the HTML file.",
                  "default": true
                }
              },
              "additionalProperties": false
            },
            {
              "type": "string",
              "description": "The file to include."
            }
          ]
        }
      }
    },
    "AngularDevkitBuildAngularProtractorSchema": {
      "title": "Protractor Target",
      "description": "Protractor target options for Build Facade.",
      "type": "object",
      "properties": {
        "protractorConfig": {
          "type": "string",
          "description": "The name of the Protractor configuration file."
        },
        "devServerTarget": {
          "type": "string",
          "description": "A dev-server builder target to run tests against in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.",
          "pattern": "^([^:\\s]+:[^:\\s]+(:[^\\s]+)?)?$"
        },
        "grep": {
          "type": "string",
          "description": "Execute specs whose names match the pattern, which is internally compiled to a RegExp."
        },
        "invertGrep": {
          "type": "boolean",
          "description": "Invert the selection specified by the 'grep' option.",
          "default": false
        },
        "specs": {
          "type": "array",
          "description": "Override specs in the protractor config.",
          "default": [],
          "items": {
            "type": "string",
            "description": "Spec name."
          }
        },
        "suite": {
          "type": "string",
          "description": "Override suite in the protractor config."
        },
        "webdriverUpdate": {
          "type": "boolean",
          "description": "Try to update webdriver.",
          "default": true
        },
        "port": {
          "type": "number",
          "description": "The port to use to serve the application."
        },
        "host": {
          "type": "string",
          "description": "Host to listen on."
        },
        "baseUrl": {
          "type": "string",
          "description": "Base URL for protractor to connect to."
        }
      },
      "additionalProperties": false
    },
    "AngularDevkitBuildAngularServerSchema": {
      "title": "Universal Target",
      "type": "object",
      "properties": {
        "main": {
          "type": "string",
          "description": "The name of the main entry-point file."
        },
        "tsConfig": {
          "type": "string",
          "default": "tsconfig.app.json",
          "description": "The name of the TypeScript configuration file."
        },
        "stylePreprocessorOptions": {
          "description": "Options to pass to style preprocessors",
          "type": "object",
          "properties": {
            "includePaths": {
              "description": "Paths to include. Paths will be resolved to project root.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "default": []
            }
          },
          "additionalProperties": false
        },
        "optimization": {
          "description": "Enables optimization of the build output. Including minification of scripts and styles, tree-shaking and dead-code elimination. For more information, see https://angular.io/guide/workspace-config#optimization-configuration.",
          "x-user-analytics": 16,
          "default": false,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Enables optimization of the scripts output.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Enables optimization of the styles output.",
                  "default": true
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ]
        },
        "fileReplacements": {
          "description": "Replace compilation source files with other compilation source files in the build.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/AngularDevkitBuildAngularServerSchema/definitions/fileReplacement"
          },
          "default": []
        },
        "outputPath": {
          "type": "string",
          "description": "Path where output will be placed."
        },
        "resourcesOutputPath": {
          "type": "string",
          "description": "The path where style resources will be placed, relative to outputPath.",
          "default": ""
        },
        "sourceMap": {
          "description": "Output source maps for scripts and styles. For more information, see https://angular.io/guide/workspace-config#source-map-configuration.",
          "default": true,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "scripts": {
                  "type": "boolean",
                  "description": "Output source maps for all scripts.",
                  "default": true
                },
                "styles": {
                  "type": "boolean",
                  "description": "Output source maps for all styles.",
                  "default": true
                },
                "hidden": {
                  "type": "boolean",
                  "description": "Output source maps used for error reporting tools.",
                  "default": false
                },
                "vendor": {
                  "type": "boolean",
                  "description": "Resolve vendor packages source maps.",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "boolean"
            }
          ]
        },
        "deployUrl": {
          "type": "string",
          "description": "URL where files will be deployed."
        },
        "verbose": {
          "type": "boolean",
          "description": "Adds more details to output logging.",
          "default": false
        },
        "progress": {
          "type": "boolean",
          "description": "Log progress to the console while building.",
          "default": true
        },
        "i18nFile": {
          "type": "string",
          "description": "Localization file to use for i18n.",
          "x-deprecated": "Use 'locales' object in the project metadata instead."
        },
        "i18nFormat": {
          "type": "string",
          "description": "Format of the localization file specified with --i18n-file.",
          "x-deprecated": "No longer needed as the format will be determined automatically."
        },
        "i18nLocale": {
          "type": "string",
          "description": "Locale to use for i18n.",
          "x-deprecated": "Use 'localize' instead."
        },
        "i18nMissingTranslation": {
          "type": "string",
          "description": "How to handle missing translations for i18n.",
          "enum": [
            "warning",
            "error",
            "ignore"
          ],
          "default": "warning"
        },
        "localize": {
          "description": "Translate the bundles in one or more locales.",
          "oneOf": [
            {
              "type": "boolean",
              "description": "Translate all locales."
            },
            {
              "type": "array",
              "description": "List of locales ID's to translate.",
              "minItems": 1,
              "items": {
                "type": "string",
                "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-[a-zA-Z]{5,8})?(-x(-[a-zA-Z0-9]{1,8})+)?$"
              }
            }
          ]
        },
        "outputHashing": {
          "type": "string",
          "description": "Define the output filename cache-busting hashing mode.",
          "default": "none",
          "enum": [
            "none",
            "all",
            "media",
            "bundles"
          ]
        },
        "deleteOutputPath": {
          "type": "boolean",
          "description": "Delete the output path before building.",
          "default": true
        },
        "preserveSymlinks": {
          "type": "boolean",
          "description": "Do not use the real path when resolving modules. If unset then will default to `true` if NodeJS option --preserve-symlinks is set."
        },
        "extractLicenses": {
          "type": "boolean",
          "description": "Extract all licenses in a separate file, in the case of production builds only.",
          "default": true
        },
        "showCircularDependencies": {
          "type": "boolean",
          "description": "Show circular dependency warnings on builds.",
          "default": true
        },
        "namedChunks": {
          "type": "boolean",
          "description": "Use file name for lazy loaded chunks.",
          "default": true
        },
        "bundleDependencies": {
          "description": "Which external dependencies to bundle into the bundle. By default, all of node_modules will be bundled.",
          "default": true,
          "oneOf": [
            {
              "type": "boolean"
            },
            {
              "type": "string",
              "enum": [
                "none",
                "all"
              ]
            }
          ]
        },
        "externalDependencies": {
          "description": "Exclude the listed external dependencies from being bundled into the bundle. Instead, the created bundle relies on these dependencies to be available during runtime.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "default": []
        },
        "statsJson": {
          "type": "boolean",
          "description": "Generates a 'stats.json' file which can be analyzed using tools such as 'webpack-bundle-analyzer'.",
          "default": false
        },
        "forkTypeChecker": {
          "type": "boolean",
          "description": "Run the TypeScript type checker in a forked process.",
          "default": true
        },
        "lazyModules": {
          "description": "List of additional NgModule files that will be lazy loaded. Lazy router modules will be discovered automatically.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "x-deprecated": "'SystemJsNgModuleLoader' is deprecated, and this is part of its usage. Use 'import()' syntax instead.",
          "default": []
        },
        "watch": {
          "type": "boolean",
          "description": "Run build when files change.",
          "default": false
        },
        "poll": {
          "type": "number",
          "description": "Enable and define the file watching poll time period in milliseconds."
        }
      },
      "additionalProperties": false,
      "definitions": {
        "fileReplacement": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "src": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                },
                "replaceWith": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "replace": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                },
                "with": {
                  "type": "string",
                  "pattern": "\\.(([cm]?j|t)sx?|json)$"
                }
              },
              "additionalProperties": false
            }
          ]
        }
      }
    },
    "AngularDevkitBuildAngularTslintSchema": {
      "title": "TSlint Target",
      "description": "TSlint target options for Build Facade.",
      "type": "object",
      "properties": {
        "tslintConfig": {
          "type": "string",
          "description": "The name of the TSLint configuration file."
        },
        "tsConfig": {
          "description": "The name of the TypeScript configuration file.",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        },
        "fix": {
          "type": "boolean",
          "description": "Fixes linting errors (may overwrite linted files).",
          "default": false
        },
        "typeCheck": {
          "type": "boolean",
          "description": "Controls the type check for linting.",
          "default": false
        },
        "force": {
          "type": "boolean",
          "description": "Succeeds even if there was linting errors.",
          "default": false
        },
        "silent": {
          "type": "boolean",
          "description": "Show output text.",
          "default": false
        },
        "format": {
          "type": "string",
          "description": "Output format (prose, json, stylish, verbose, pmd, msbuild, checkstyle, vso, fileslist).",
          "default": "stylish",
          "anyOf": [
            {
              "enum": [
                "checkstyle",
                "codeFrame",
                "filesList",
                "json",
                "junit",
                "msbuild",
                "pmd",
                "prose",
                "stylish",
                "tap",
                "verbose",
                "vso"
              ]
            },
            {
              "minLength": 1
            }
          ]
        },
        "exclude": {
          "type": "array",
          "description": "Files to exclude from linting.",
          "default": [],
          "items": {
            "type": "string"
          }
        },
        "files": {
          "type": "array",
          "description": "Files to include in linting.",
          "default": [],
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "AngularDevkitBuildAngularNgPackagrSchema": {
      "title": "ng-packagr Target",
      "description": "ng-packagr target options for Build Architect. Use to build library projects.",
      "type": "object",
      "properties": {
        "project": {
          "type": "string",
          "description": "The file path for the ng-packagr configuration file, relative to the current workspace."
        },
        "tsConfig": {
          "type": "string",
          "description": "The full path for the TypeScript configuration file, relative to the current workspace."
        },
        "watch": {
          "type": "boolean",
          "description": "Run build when files change.",
          "default": false
        }
      },
      "additionalProperties": false
    }
  }
}

@google-cla google-cla bot added the cla: yes label Mar 9, 2021
@alan-agius4 alan-agius4 added the target: major This PR is targeted for the next major release label Mar 9, 2021
@alan-agius4 alan-agius4 requested a review from clydin March 9, 2021 09:23
With this change we automate the generation of `@angular/cli/lib/config/schema.json`. While on paper we could use quicktype for this. Quicktype doesn't handle `patternProperties` and `oneOf` that well.

How does this works?
Relative `$ref` will be resolved and inlined as part of the root schema definitions.

Example
```json
"@schematics/angular:enum": {
    "$ref": "../../../../schematics/angular/enum/schema.json"
},
```

Will be parsed and transformed to
```json
"@schematics/angular:enum": {
  "$ref": "#/definitions/SchematicsAngularEnumSchema"
},
"definitions: {
  "SchematicsAngularEnumSchema": {
    "title": "Angular Enum Options Schema",
    "type": "object",
    "description": "Generates a new, generic enum definition for the given or default project.",
    "properties": {...}
   }
}
```
@alan-agius4 alan-agius4 added the action: merge The PR is ready for merge by the caretaker label Mar 11, 2021
@alan-agius4 alan-agius4 merged commit 4b0223b into angular:master Mar 11, 2021
@alan-agius4 alan-agius4 deleted the json-schema branch March 11, 2021 20:51
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators Apr 11, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker target: major This PR is targeted for the next major release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants