Full Code of hamzahamidi/ajsf for AI

main 587dbed91c7c cached
261 files
696.5 KB
188.4k tokens
493 symbols
1 requests
Download .txt
Showing preview only (769K chars total). Download the full file or copy to clipboard to get everything.
Repository: hamzahamidi/ajsf
Branch: main
Commit: 587dbed91c7c
Files: 261
Total size: 696.5 KB

Directory structure:
gitextract_hea3k8sd/

├── .browserslistrc
├── .editorconfig
├── .github/
│   └── workflows/
│       ├── ci.yml
│       ├── codeql-analysis.yml
│       ├── dependabot.yml
│       ├── deploy.yml
│       └── stale.yml
├── .gitignore
├── .nvmrc
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── angular.json
├── demo/
│   ├── app/
│   │   ├── ace-editor.directive.ts
│   │   ├── demo-root.component.ts
│   │   ├── demo.component.html
│   │   ├── demo.component.ts
│   │   ├── demo.module.ts
│   │   ├── demo.routes.ts
│   │   └── example-schemas.model.ts
│   ├── assets/
│   │   └── example-schemas/
│   │       ├── asf-array.json
│   │       ├── asf-basic-json-schema-type.json
│   │       ├── asf-bootstrap-grid.json
│   │       ├── asf-complex-key-support.json
│   │       ├── asf-hack-conditional-required.json
│   │       ├── asf-kitchen-sink.json
│   │       ├── asf-simple.json
│   │       ├── asf-tab-array.json
│   │       ├── asf-titlemap-examples.json
│   │       ├── jsf-events.json
│   │       ├── jsf-factory-sleek.json
│   │       ├── jsf-fields-ace.json
│   │       ├── jsf-fields-actions.json
│   │       ├── jsf-fields-advancedfieldset.json
│   │       ├── jsf-fields-array-simple.json
│   │       ├── jsf-fields-array.json
│   │       ├── jsf-fields-authfieldset.json
│   │       ├── jsf-fields-autocomplete.json
│   │       ├── jsf-fields-checkbox.json
│   │       ├── jsf-fields-checkboxbuttons.json
│   │       ├── jsf-fields-checkboxes.json
│   │       ├── jsf-fields-color.json
│   │       ├── jsf-fields-common.json
│   │       ├── jsf-fields-fieldset.json
│   │       ├── jsf-fields-help.json
│   │       ├── jsf-fields-hidden.json
│   │       ├── jsf-fields-iconselect.json
│   │       ├── jsf-fields-imageselect.json
│   │       ├── jsf-fields-password.json
│   │       ├── jsf-fields-questions.json
│   │       ├── jsf-fields-radiobuttons.json
│   │       ├── jsf-fields-radios.json
│   │       ├── jsf-fields-range.json
│   │       ├── jsf-fields-section.json
│   │       ├── jsf-fields-select.json
│   │       ├── jsf-fields-selectfieldset-key.json
│   │       ├── jsf-fields-selectfieldset.json
│   │       ├── jsf-fields-submit.json
│   │       ├── jsf-fields-tabarray-maxitems.json
│   │       ├── jsf-fields-tabarray-value.json
│   │       ├── jsf-fields-tabarray.json
│   │       ├── jsf-fields-textarea.json
│   │       ├── jsf-gettingstarted.json
│   │       ├── jsf-previousvalues-multidimensional.json
│   │       ├── jsf-previousvalues.json
│   │       ├── jsf-schema-array.json
│   │       ├── jsf-schema-basic.json
│   │       ├── jsf-schema-default.json
│   │       ├── jsf-schema-inlineref.json
│   │       ├── jsf-schema-morecomplex.json
│   │       ├── jsf-schema-required.json
│   │       ├── jsf-templating-idx.json
│   │       ├── jsf-templating-tpldata.json
│   │       ├── jsf-templating-value.json
│   │       ├── jsf-templating-values.json
│   │       ├── json-schema-draft01.json
│   │       ├── json-schema-draft02.json
│   │       ├── json-schema-draft03.json
│   │       ├── json-schema-draft04.json
│   │       ├── json-schema-draft06.json
│   │       ├── ng-jsf-data-only.json
│   │       ├── ng-jsf-deep-ref.json
│   │       ├── ng-jsf-flex-layout.json
│   │       ├── ng-jsf-layout-only.json
│   │       ├── ng-jsf-nested-arrays.json
│   │       ├── ng-jsf-select-list-examples.json
│   │       ├── ng-jsf-select-widget-examples.json
│   │       ├── ng-jsf-simple-array.json
│   │       ├── rjsf-alternatives.json
│   │       ├── rjsf-arrays.json
│   │       ├── rjsf-custom-array.json
│   │       ├── rjsf-custom.json
│   │       ├── rjsf-date-and-time.json
│   │       ├── rjsf-errors.json
│   │       ├── rjsf-files.json
│   │       ├── rjsf-large.json
│   │       ├── rjsf-nested.json
│   │       ├── rjsf-numbers.json
│   │       ├── rjsf-ordering.json
│   │       ├── rjsf-references.json
│   │       ├── rjsf-simple.json
│   │       ├── rjsf-single.json
│   │       ├── rjsf-validation.json
│   │       ├── rjsf-widgets.json
│   │       └── sources.md
│   ├── environments/
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── index.html
│   ├── karma.conf.js
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.scss
│   ├── test.ts
│   ├── tsconfig.app.json
│   ├── tsconfig.spec.json
│   └── tslint.json
├── docs/
│   └── issue_template.md
├── e2e/
│   ├── protractor.conf.js
│   ├── src/
│   │   ├── app.e2e-spec.ts
│   │   └── app.po.ts
│   └── tsconfig.e2e.json
├── package.json
├── projects/
│   ├── ajsf-bootstrap3/
│   │   ├── README.md
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── bootstrap3-framework.component.html
│   │   │   │   ├── bootstrap3-framework.component.scss
│   │   │   │   ├── bootstrap3-framework.component.spec.ts
│   │   │   │   ├── bootstrap3-framework.component.ts
│   │   │   │   ├── bootstrap3-framework.module.ts
│   │   │   │   └── bootstrap3.framework.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── ajsf-bootstrap4/
│   │   ├── README.md
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── bootstrap4-framework.component.html
│   │   │   │   ├── bootstrap4-framework.component.scss
│   │   │   │   ├── bootstrap4-framework.component.spec.ts
│   │   │   │   ├── bootstrap4-framework.component.ts
│   │   │   │   ├── bootstrap4-framework.module.ts
│   │   │   │   └── bootstrap4.framework.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── ajsf-core/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── framework-library/
│   │   │   │   │   ├── framework-library.service.ts
│   │   │   │   │   ├── framework.ts
│   │   │   │   │   ├── no-framework.component.html
│   │   │   │   │   ├── no-framework.component.ts
│   │   │   │   │   ├── no-framework.module.ts
│   │   │   │   │   └── no.framework.ts
│   │   │   │   ├── json-schema-form.component.html
│   │   │   │   ├── json-schema-form.component.ts
│   │   │   │   ├── json-schema-form.module.ts
│   │   │   │   ├── json-schema-form.service.ts
│   │   │   │   ├── locale/
│   │   │   │   │   ├── de-validation-messages.ts
│   │   │   │   │   ├── en-validation-messages.ts
│   │   │   │   │   ├── es-validation-messages.ts
│   │   │   │   │   ├── fr-validation-messages.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── it-validation-messages.ts
│   │   │   │   │   ├── pt-validation-messages.ts
│   │   │   │   │   └── zh-validation-messages.ts
│   │   │   │   ├── locale-dates/
│   │   │   │   │   └── en-US.ts
│   │   │   │   ├── shared/
│   │   │   │   │   ├── convert-schema-to-draft6.function.ts
│   │   │   │   │   ├── form-group.functions.ts
│   │   │   │   │   ├── format-regex.constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── json-schema.functions.ts
│   │   │   │   │   ├── json.validators.ts
│   │   │   │   │   ├── jsonpointer.functions.ts
│   │   │   │   │   ├── jspointer.functions.json.spec.ts
│   │   │   │   │   ├── layout.functions.ts
│   │   │   │   │   ├── merge-schemas.function.ts
│   │   │   │   │   ├── utility.functions.ts
│   │   │   │   │   ├── validator.functions.spec.ts
│   │   │   │   │   └── validator.functions.ts
│   │   │   │   └── widget-library/
│   │   │   │       ├── add-reference.component.ts
│   │   │   │       ├── button.component.ts
│   │   │   │       ├── checkbox.component.ts
│   │   │   │       ├── checkboxes.component.ts
│   │   │   │       ├── file.component.ts
│   │   │   │       ├── hidden.component.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── input.component.ts
│   │   │   │       ├── message.component.ts
│   │   │   │       ├── none.component.ts
│   │   │   │       ├── number.component.ts
│   │   │   │       ├── one-of.component.ts
│   │   │   │       ├── orderable.directive.ts
│   │   │   │       ├── radios.component.ts
│   │   │   │       ├── root.component.ts
│   │   │   │       ├── section.component.ts
│   │   │   │       ├── select-framework.component.ts
│   │   │   │       ├── select-widget.component.ts
│   │   │   │       ├── select.component.ts
│   │   │   │       ├── submit.component.ts
│   │   │   │       ├── tab.component.ts
│   │   │   │       ├── tabs.component.ts
│   │   │   │       ├── template.component.ts
│   │   │   │       ├── textarea.component.ts
│   │   │   │       ├── widget-library.module.ts
│   │   │   │       └── widget-library.service.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── ajsf-material/
│       ├── README.md
│       ├── karma.conf.js
│       ├── ng-package.json
│       ├── package.json
│       ├── src/
│       │   ├── lib/
│       │   │   ├── angular-flex-monkey-patch.ts
│       │   │   ├── material-design-framework.component.html
│       │   │   ├── material-design-framework.component.scss
│       │   │   ├── material-design-framework.component.spec.ts
│       │   │   ├── material-design-framework.component.ts
│       │   │   ├── material-design-framework.module.ts
│       │   │   ├── material-design.framework.ts
│       │   │   └── widgets/
│       │   │       ├── flex-layout-root.component.html
│       │   │       ├── flex-layout-root.component.ts
│       │   │       ├── flex-layout-section.component.ts
│       │   │       ├── material-add-reference.component.ts
│       │   │       ├── material-button-group.component.ts
│       │   │       ├── material-button.component.ts
│       │   │       ├── material-checkbox.component.ts
│       │   │       ├── material-checkboxes.component.ts
│       │   │       ├── material-chip-list.component.ts
│       │   │       ├── material-datepicker.component.ts
│       │   │       ├── material-file.component.ts
│       │   │       ├── material-input.component.ts
│       │   │       ├── material-number.component.ts
│       │   │       ├── material-one-of.component.ts
│       │   │       ├── material-radios.component.ts
│       │   │       ├── material-select.component.ts
│       │   │       ├── material-slider.component.ts
│       │   │       ├── material-stepper.component.ts
│       │   │       ├── material-tabs.component.ts
│       │   │       ├── material-textarea.component.ts
│       │   │       └── public_api.ts
│       │   ├── public_api.ts
│       │   └── test.ts
│       ├── tsconfig.lib.json
│       ├── tsconfig.lib.prod.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── tsconfig.json
└── tslint.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For IE 9-11 support, please uncomment the last line of the file and adjust as needed
> 0.5%
last 2 versions
Firefox ESR
not dead
# IE 9-11

================================================
FILE: .editorconfig
================================================
# Editor configuration, see http://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'
        required: true
        default: 'warning'
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  ci:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x, lts/*]

    steps:
    - uses: actions/checkout@v3
    - name: Setup Node ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - name: Build libs and demo
      run: npm run build:demo
    - name: Test libs
      run: |
        npm run test:core -- --code-coverage --no-watch --no-progress --browsers=ChromeHeadlessCI
        npm run test:bs3 -- --code-coverage --no-watch --no-progress --browsers=ChromeHeadlessCI
        npm run test:bs4 -- --code-coverage --no-watch --no-progress --browsers=ChromeHeadlessCI
        npm run test:material -- --code-coverage --no-watch --no-progress --browsers=ChromeHeadlessCI
    - name: Publish code coverage
      run: npm run publish:coverage


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"

on:
  push:
    branches: [main, angular6-json-schema-form]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [main, angular6-json-schema-form]
  schedule:
    - cron: '0 18 * * 3'

jobs:
  analyse:
    name: Analyse
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        # We must fetch at least the immediate parents so that if this is
        # a pull request then we can checkout the head.
        fetch-depth: 2

    # If this run was triggered by a pull request event, then checkout
    # the head of the pull request instead of the merge commit.
    - run: git checkout HEAD^2
      if: ${{ github.event_name == 'pull_request' }}

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      # Override language selection by uncommenting this and choosing your languages
      # with:
      #   languages: go, javascript, csharp, python, cpp, java

    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v1

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1


================================================
FILE: .github/workflows/dependabot.yml
================================================
version: 2
updates:
  # npm dependencies
  - package-ecosystem: "npm"
    # package.json directory
    directory: "/"
    # Check for dependencies update every week on Sunday so owners are not spammed during the week
    schedule:
      interval: "monthly"
    # 10 PRs created per week max seems managable?
    open-pull-requests-limit: 5
    commit-message:
      # Prefix all commit messages with "build"
      prefix: "build"
  - package-ecosystem: "npm"
    directory: "/projects/ajsf-core"
    schedule:
      interval: "weekly"
      day: "sunday"
    open-pull-requests-limit: 5
    commit-message:
      prefix: "build"
  - package-ecosystem: "npm"
    directory: "/projects/ajsf-material"
    schedule:
      interval: "weekly"
      day: "sunday"
    open-pull-requests-limit: 5
    commit-message:
      prefix: "build"
  - package-ecosystem: "npm"
    directory: "/projects/ajsf-bootstrap3"
    schedule:
      interval: "weekly"
      day: "sunday"
    open-pull-requests-limit: 5
    commit-message:
      prefix: "build"
  - package-ecosystem: "npm"
    directory: "/projects/ajsf-bootstrap4"
    schedule:
      interval: "weekly"
      day: "sunday"
    open-pull-requests-limit: 5
    commit-message:
      prefix: "build"


================================================
FILE: .github/workflows/deploy.yml
================================================
name: Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: setup Node
      uses: actions/setup-node@v3
    - run: npm ci
    - run: npm run build:demo

    - name: deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./dist/demo
        exclude_assets: ''


================================================
FILE: .github/workflows/stale.yml
================================================
name: Mark stale issues and pull requests

on:
  schedule:
  - cron: "0 0 * * *"

jobs:
  stale:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/stale@v1
      with:
        repo-token: ${{ secrets.GITHUB_TOKEN }}
        stale-issue-message: 'Stale issue'
        stale-pr-message: 'Stale pull request'
        stale-issue-label: 'no-issue-activity'
        stale-pr-label: 'no-pr-activity'


================================================
FILE: .gitignore
================================================
# See http://help.github.com/ignore-files/ for more about ignoring files.

# compiled output
/dist
/tmp
/out-tsc

# dependencies
/node_modules

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

# misc
/.angular/cache
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings

# System Files
.DS_Store
Thumbs.db


================================================
FILE: .nvmrc
================================================
16.13.2


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to ajsf

ajsf is an open project and welcomes contributions. These guidelines are provided to help you understand how the project works and to make contributing smooth and fun for everybody involved.

There are two main forms of contribution: reporting issues and performing code changes.

## Reporting Issues

If you find a problem with ajsf, report it using [GitHub issues](https://github.com/hamzahamidi/ajsf/issues/new).

Before reporting a new issue, please take a moment to check whether it has already been reported
[here](https://github.com/hamzahamidi/ajsf/issues). If this is the case, please:

- Read all the comments to confirm that it's the same issue you're having.
- Refrain from adding "same thing here" or "+1" comments. Just hit the
  "subscribe" button to get notifications for this issue.
- Add a comment only if you can provide helpful information that has not been
  provided in the discussion yet.

When creating a new issue, make sure you include:

1. As much detail as possible about your setup/environment
1. Steps to reproduce the issue/bug
1. What you expected to happen
1. What happened instead

This information will help to determine the cause and prepare a fix as fast as possible.

## Code Changes

Code contributions come in various forms and sizes, from simple bug fixes to implementation
of new features.

To send your code change, use GitHub pull requests. The workflow is as follows:

  1. Fork the project.

  1. Create a branch based on `main`.

  1. Implement your change, including tests and documentation.

  1. Run tests to make sure your change didn't break anything.

  1. Publish the branch and create a pull request.

  1. ajsf developers will review your change and possibly point out issues.
     Adapt the code under their guidance until all issues are resolved.

  1. Finally, the pull request will get merged or rejected.

See also [GitHub's guide on contributing](https://help.github.com/articles/fork-a-repo).

If you want to do multiple unrelated changes, use separate branches and pull
requests.

### Start the development environment

Let's first generate all the bundles we need to start the demo:

```bash
$ cd ajsf
$ yarn install or npm install
$ yarn start
```

You can stop the demo application.
The tricky part now is to run concurrently both the demo application & the library in watch mode.
So, first choose which library you want to change then run `$ ng build @ajsf/core --watch` for example
to build in watch mode the `@ajsf/core`.
Now let's start the demo application in watch mode too. So, open a new terminal and run `$ ng serve` and there you go.
This method is tricky but it works perfectly in all environments (I tried other methods like npm-run-all
or concurrently packages but angular-cli build doesn't restart after a failed build).
If you have a better method please send a PR.

### Commits

Each commit in the pull request should do only one thing, which is clearly
described by its commit message. Especially avoid mixing formatting changes and
functional changes into one commit. When writing commit messages, adhere to
[Angular Conventional Commit](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-guidelines).

#### Commit Message Format
Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
format that includes a **type**, a **scope** and a **subject**:

```
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```

The **header** is mandatory and the **scope** of the header is optional.

Any line of the commit message cannot be longer than 100 characters! This allows the message to be easier
to read on GitHub as well as in various git tools.

The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.

```markdown
docs(changelog): update changelog to beta.5
```

```markdown
fix(release): need to depend on latest rxjs and zone.js

The version in our package.json gets copied to the one we publish, and users need the latest of these.
```

#### Type

Must be one of the following:

* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)
* **docs**: Documentation only changes
* **feat**: A new feature
* **fix**: A bug fix
* **perf**: A code change that improves performance
* **refactor**: A code change that neither fixes a bug nor adds a feature
* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
* **test**: Adding missing tests or correcting existing tests

#### Scope

The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages).

The following is the list of supported scopes:

* **ajsf/core**
* **ajsf/bs3**
* **ajsf/bs4**
* **ajsf/material**
* **locales**
* **demo**
* ...

When the commit fixes a bug, put a message in the body of the commit message
pointing to the number of the issue (e.g. "Fixes #123").

### Pull requests and branches

All work happens in branches. The main branch is only used as the target for pull
requests.

During code review you often need to update pull requests. Usually you do that
by pushing additional commits.

In some cases where the commit history of a pull request gets too cumbersome to
review or you need bigger changes in the way you approach a problem which needs
changing of commits you already did it's more practical to create a new pull
request. This new pull request often will contain squashed versions of the
previous pull request. Use that to clarify the changes contained in a pull
request and to make review easier.

When you replace a pull request by another one, add a message in the
description of the new pull request on GitHub referencing the pull request it
replaces (e.g. "Supersedes #123").


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 Hamza Hamidi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# AJSF (Angular JSON Schema Form)

**N.B:** For Angular6-json-schema-form please check [this documentation](https://github.com/hamzahamidi/ajsf/tree/angular6-json-schema-form).

<p align="center">
  <a href="https://github.com/hamzahamidi/ajsf/actions?query=workflow%3ACI+branch%3Amain"><img src="https://github.com/hamzahamidi/ajsf/workflows/CI/badge.svg" alt="CI Status"></a>
  <a href="https://www.npmjs.com/package/@ajsf/core"><img src="https://img.shields.io/npm/dm/@ajsf/core.svg?style=plastic" alt="npm number of downloads"></a>
  <a href="https://github.com/hamzahamidi/ajsf/blob/master/LICENSE"><img src="https://img.shields.io/github/license/hamzahamidi/ajsf.svg?style=social" alt="LICENSE IMT"></a>
  <a href="https://app.netlify.com/sites/ajsf/deploys"><img src="https://api.netlify.com/api/v1/badges/6c5b5a1d-db7c-4d0e-8ac1-a4840d8812f0/deploy-status" alt="Netlify Status"></a>
</p>

Note: This project is a continuation to [dschnelldavis/Angular2-json-schema-form](https://github.com/dschnelldavis/angular2-json-schema-form) and is not affiliated with any organization.

A [JSON Schema](http://json-schema.org) Form builder for Angular, similar to, and mostly API compatible with:

* [JSON Schema Form](https://github.com/json-schema-form)'s [Angular Schema Form](http://schemaform.io) for [AngularJS](https://angularjs.org) ([examples](http://schemaform.io/examples/bootstrap-example.html))
* [Mozilla](https://blog.mozilla.org/services/)'s [React JSON Schema Form](https://github.com/mozilla-services/react-jsonschema-form) for [React](https://facebook.github.io/react/) ([examples](https://mozilla-services.github.io/react-jsonschema-form/)), and
* [Joshfire](http://www.joshfire.com)'s [JSON Form](http://github.com/joshfire/jsonform/wiki) for [jQuery](https://jquery.com) ([examples](http://ulion.github.io/jsonform/playground/))

## Packages

* [`@ajsf/core`](./README.md) [![npm version](https://badge.fury.io/js/%40ajsf%2Fcore.svg)](https://badge.fury.io/js/%40ajsf%2Fcore)
* [`@ajsf/bootstrap3`](./projects/ajsf-bootstrap3/README.md) [![npm version](https://badge.fury.io/js/%40ajsf%2Fbootstrap3.svg)](https://badge.fury.io/js/%40ajsf%2Fbootstrap3)
* [`@ajsf/bootstrap4`](./projects/ajsf-bootstrap4/README.md) [![npm version](https://badge.fury.io/js/%40ajsf%2Fbootstrap4.svg)](https://badge.fury.io/js/%40ajsf%2Fbootstrap4)
* [`@ajsf/material`](./projects/ajsf-material/README.md) [![npm version](https://badge.fury.io/js/%40ajsf%2Fmaterial.svg)](https://badge.fury.io/js/%40ajsf%2Fmaterial)

## Check out the live demo and play with the examples

[Check out some examples here.](https://hamidihamza.com/ajsf)

This example playground features over 70 different JSON Schemas for you to try (including all examples used by each of the three libraries listed above), and the ability to quickly view any example formatted with Material Design, Bootstrap 3, Bootstrap 4, or without any formatting.

## Installation

### To install from NPM/YARN and use in your own project

If you want to try out the libraries, you can for example [install @ajsf/material package from NPM](https://www.npmjs.com/package/@ajsf/material) which uses `material-angular` UI. You can use either [NPM](https://www.npmjs.com) or [Yarn](https://yarnpkg.com). To install with NPM, run the following from your terminal:

```shell
npm install @ajsf/material@latest
```

With YARN, run the following:

```shell
yarn add @ajsf/material@latest
```

Then import `MaterialDesignFrameworkModule` in your main application module like this:

```javascript
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { MaterialDesignFrameworkModule } from '@ajsf/material';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [ AppComponent ],
  imports: [
    MaterialDesignFrameworkModule
  ],
  providers: [],
  bootstrap: [ AppComponent ]
})
export class AppModule { }
```

Four framework modules are currently included, the import is the same as above :

* MaterialDesignFrameworkModule from @ajsf/material — Material Design
* Bootstrap3FrameworkModule from @ajsf/bootstrap3 — Bootstrap 3
* Bootstrap4FrameworkModule from @ajsf/bootstrap4 — Bootstrap 4
* JsonSchemaFormModule from @ajsf/core — plain HTML (for testing)

It is also possible to load multiple frameworks and switch between them at runtime, like the example playground on GitHub. But most typical sites will just load one framework.

### To install from GitHub

To install [the library and the example playground from GitHub](https://github.com/hamzahamidi/ajsf), clone `https://github.com/hamzahamidi/ajsf.git` with your favorite git program. Or, assuming you have [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and [Node/YARN](https://nodejs.org/en/download/) installed, enter the following in your terminal:

```shell
git clone https://github.com/hamzahamidi/ajsf.git ajsf
cd ajsf
yarn install
yarn start
```

This should start a server with the example playground, which you can view in your browser at `http://localhost:4200`

The source code is composed as the following:

* `projects/ajsf-core` - Angular JSON Schema Form main library
* `projects/ajsf-bootstrap3` - Framework for Bootstrap 3
* `projects/ajsf-bootstrap4` - Framework for Bootstrap 4
* `projects/ajsf-material` - Framework for Angular Material
* `projects/ajsf-core/src/lib/framework-library` - framework library
* `projects/ajsf-core/src/lib/widget-library` - widget library
* `projects/ajsf-core/src/lib/shared` - various utilities and helper functions
* `demo` - the demonstration playground example application
* `demo/assets/example-schemas` - JSON Schema examples used in the playground

If you want detailed documentation describing the individual functions used in this library, check the README in each component. (Angular JSON Schema Form is still a work in progress, so right now this documentation varies from highly detailed to completely missing.)

## Using Angular JSON Schema Form

### Basic use

For basic use, after loading JsonSchemaFormModule as described above, to display a form in your Angular component, simply add the following to your component's template:

```html
<json-schema-form
  loadExternalAssets="true"
  [schema]="yourJsonSchema"
  framework="no-framework"
  (onSubmit)="yourOnSubmitFn($event)">
</json-schema-form>
```

Where `schema` is a valid JSON schema object, and `onSubmit` calls a function to process the submitted JSON form data. If you don't already have your own schemas, you can find a bunch of samples to test with in the `demo/assets/example-schemas` folder, as described above.

`framework` is for the template you want to use, the default value is `no-framwork`. The possible values are:

* `material-design` for  Material Design.
* `bootstrap-3` for Bootstrap 3.
* `bootstrap-4` for 'Bootstrap 4.
* `no-framework` for (plain HTML).

Setting `loadExternalAssets="true"` will automatically load any additional assets needed by the display framework. It is useful when you are trying out this library, but production sites should instead load all required assets separately. For full details see 'Changing or adding frameworks', below.

### Data-only mode

Angular JSON Schema Form can also create a form entirely from a JSON object—with no schema—like so:

```html
<json-schema-form
  loadExternalAssets="true"
  [(ngModel)]="exampleJsonObject">
</json-schema-form>
```

```javascript
exampleJsonObject = {
  "first_name": "Jane", "last_name": "Doe", "age": 25, "is_company": false,
  "address": {
    "street_1": "123 Main St.", "street_2": null,
    "city": "Las Vegas", "state": "NV", "zip_code": "89123"
  },
  "phone_numbers": [
    { "number": "702-123-4567", "type": "cell" },
    { "number": "702-987-6543", "type": "work" }
  ], "notes": ""
};
```

In this mode, Angular JSON Schema Form automatically generates a schema from your data. The generated schema is relatively simple, compared to what you could create on your own. However, as the above example shows, it does detect and enforce string, number, and boolean values (nulls are also assumed to be strings), and automatically allows array elements to be added, removed, and reordered.

After displaying a form in this mode, you can also use the `formSchema` and `formLayout` outputs (described in 'Debugging inputs and outputs', below), to return the generated schema and layout, which will give you a head start on writing your own schemas and layouts by showing you examples created from your own data.

Also, notice that the 'ngModel' input supports Angular's 2-way data binding, just like other form controls, which is why it is not always necessary to use an onSubmit function.

### Advanced use

#### Additional inputs an outputs

For more control over your form, you may provide these additional inputs:

* `layout` array with a custom form layout (see Angular Schema Form's [form definitions](https://github.com/json-schema-form/angular-schema-form/blob/master/docs/index.md#form-definitions) for information about how to construct a form layout)
* `data` object to populate the form with default or previously submitted values
* `options` object to set any global options for the form
* `widgets` object to add custom widgets
* `language` string to set the error message language (currently supports 'de', 'en', 'es', 'fr', 'it', 'pt', 'zh')
* `framework` string or object to set which framework to use

For `framework`, you can pass in your own custom framework object, or, if you've loaded multiple frameworks, you can specify the name of the framework you want to use. To switch between the included frameworks, use 'material-design', 'bootstrap-3', 'bootstrap-4', and 'no-framework'.

If you want more detailed output, you may provide additional functions for `onChanges` to read the values in real time as the form is being filled out, and you may implement your own custom validation indicators from the boolean `isValid` or the detailed `validationErrors` outputs.

Here is an example:

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [layout]="yourJsonFormLayout"
  [(data)]="yourData"
  [options]="yourFormOptions"
  [widgets]="yourCustomWidgets"
  language="fr"
  framework="material-design"
  loadExternalAssets="true"
  (onChanges)="yourOnChangesFn($event)"
  (onSubmit)="yourOnSubmitFn($event)"
  (isValid)="yourIsValidFn($event)"
  (validationErrors)="yourValidationErrorsFn($event)">
</json-schema-form>
```

Note: If you prefer brackets around all your attributes, the following is functionally equivalent:

```html
<json-schema-form
[schema]="yourJsonSchema"
[layout]="yourJsonFormLayout"
[(data)]="yourData"
[options]="yourFormOptions"
[widgets]="yourCustomWidgets"
[language]="'fr'"
[framework]="'material-design'"
[loadExternalAssets]="true"
(onChanges)="yourOnChangesFn($event)"
(onSubmit)="yourOnSubmitFn($event)"
(isValid)="yourIsValidFn($event)"
(validationErrors)="yourValidationErrorsFn($event)">
</json-schema-form>
```

If you use this syntax, make sure to include the nested quotes (`"'` and `'"`) around the language and framework names. (If you leave out the inner quotes, Angular will read them as a variable names, rather than strings, which will cause errors. All un-bracketed attributes, however, are automatically read as strings, so they don't need inner quotes.)

#### Single-input mode

You may also combine all your inputs into one compound object and include it as a `form` input, like so:

```javascript
const yourCompoundInputObject = {
  schema:    { ... },  // REQUIRED
  layout:    [ ... ],  // optional
  data:      { ... },  // optional
  options:   { ... },  // optional
  widgets:   { ... },  // optional
  language:   '...' ,  // optional
  framework:  '...'    // (or { ... }) optional
}
```

```html
<json-schema-form
  [form]="yourCompoundInputObject"
  (onSubmit)="yourOnSubmitFn($event)">
</json-schema-form>
```

You can also mix these two styles depending on your needs. In the example playground, all examples use the combined `form` input for `schema`, `layout`, and `data`, which enables each example to control those three inputs, but the playground uses separate inputs for `language` and `framework`, enabling it to change those settings independent of the example.

Combining inputs is useful if you have many unique forms and store each form's data and schema together. If you have one form (or many identical forms), it will likely be more useful to use separate inputs for your data and schema. Though even in that case, if you use a custom layout, you could store your schema and layout together and use one input for both.

#### Compatibility modes

If you have previously used another JSON form creation library—Angular Schema Form (for AngularJS), React JSON Schema Form, or JSON Form (for jQuery)—in order to make the transition easier, Angular JSON Schema Form will recognize the input names and custom input objects used by those libraries. It should automatically work with JSON Schemas in [version 6](http://json-schema.org/draft-06/schema), [version 4](http://json-schema.org/draft-04/schema), [version 3](http://json-schema.org/draft-03/schema), or the [truncated version 3 format supported by JSON Form](https://github.com/joshfire/jsonform/wiki#schema-shortcut). So the following will all work:

Angular Schema Form (AngularJS) compatibility:

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [form]="yourAngularSchemaFormLayout"
  [(model)]="yourData">
</json-schema-form>
```

React JSON Schema Form compatibility:

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [UISchema]="yourReactJsonSchemaFormUISchema"
  [(formData)]="yourData">
</json-schema-form>
```

JSON Form (jQuery) compatibility:

```html
<json-schema-form
  [form]="{
    schema: yourJsonSchema,
    form: yourJsonFormLayout,
    customFormItems: yourJsonFormCustomFormItems,
    value: yourData
  }">
</json-schema-form>
```

Note: 2-way data binding will work with any dedicated data input, including 'data', 'model', 'ngModel', or 'formData'. However, 2-way binding will _not_ work with the combined 'form' input.

#### Debugging inputs and outputs

Finally, Angular JSON Schema Form includes some additional inputs and outputs for debugging:

* `debug` input — Activates debugging mode.
* `loadExternalAssets` input — Causes external JavaScript and CSS needed by the selected framework to be automatically loaded from a CDN (this is not 100% reliable, so while this can be helpful during development and testing, it is not recommended for production)—Note: If you are using this mode and get a console error saying an external asset has not loaded (such as jQuery, required for Bootstrap 3) simply reloading your web browser will usually fix it.
* `formSchema` and `formLayout` outputs — Returns the final schema and layout used to create the form (which will either show how your original input schema and layout were modified, if you provided inputs, or show you the automatically generated ones, if you didn't).

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [debug]="true"
  loadExternalAssets="true"
  (formSchema)="showFormSchemaFn($event)"
  (formLayout)="showFormLayoutFn($event)">
</json-schema-form>
```

## Customizing

In addition to a large number of user-settable options, Angular JSON Schema Form also has the ability to load custom form control widgets and layout frameworks. All forms are constructed from these basic components. The default widget library includes all standard HTML 5 form controls, as well as several common layout patterns, such as multiple checkboxes and tab sets. The default framework library includes templates to style forms using Material Design, Bootstrap 3, or Bootstrap 4 (or plain HTML with no formatting, which is not useful in production, but can be helpful for development and debugging).

### User settings

(TODO: List all available user settings, and configuration options for each.)

### Creating custom input validation error messages

You can easily add your own custom input validation error messages, either for individual control widgets, or for your entire form.

#### Setting error messages for individual controls or the entire form

To set messages for individual form controls, add them to that control's node in the form layout, like this:

```javascript
const yourFormLayout = [
  { key: 'name',
    title: 'Enter your name',
    validationMessages: {
      // Put your error messages for the 'name' field here
    }
  },
  { type: 'submit', title: 'Submit' }
]
```

To set messages for the entire form, add them to the form options, inside the defautWidgetOptions validationMessages object, like this:

```javascript
const yourFormOptions = {
  defautWidgetOptions: {
    validationMessages: {
      // Put your error messages for the entire form here
    }
  }
}
```

#### How to format error messages

The validationMessages object—in either a layout node or the form options—contains the names of each error message you want to set as keys, and the corresponding messages as values. Messages may be in any of the following formats:

* String: A plain text message, which is always the same.
* String template: A text message that includes Angular template-style {{variables}}, which will be be replaced with values from the returned error object.
* Function: A JavaScript function which accepts the error object as input, and returns a string error message.

Here are examples of all three error message types:

```javascript
validationMessages: {

  // String error message
  required: 'This field is required.',

  // String template error message
  // - minimumLength variable will be replaced
  minLength: 'Must be at least {{minimumLength}} characters long.',

  // Function error message
  // - example error object:   { multipleOfValue: 0.01, currentValue: 3.456 }
  // - resulting error message: 'Must have 2 or fewer decimal places.'
  multipleOf: function(error) {
    if ((1 / error.multipleOfValue) % 10 === 0) {
      const decimals = Math.log10(1 / error.multipleOfValue);
      return `Must have ${decimals} or fewer decimal places.`;
    } else {
      return `Must be a multiple of ${error.multipleOfValue}.`;
    }
  }
}
```

(Note: These examples are from the default set of built-in error messages, which includes messages for all JSON Schema errors except type, const, enum, and dependencies.)

#### Available input validation errors and object values

Here is a list of all the built-in JSON Schema errors, which data type each error is available for, and the values in their returned error objects:

Error name       | Data type | Returned error object values
-----------------|-----------|-----------------------------------------
required         |  any      | (none)
type             |  any      | requiredType,          currentValue
const            |  any      | requiredValue,         currentValue
enum             |  any      | allowedValues,         currentValue
minLength        |  string   | minimumLength,         currentLength
maxLength        |  string   | maximumLength,         currentLength
pattern          |  string   | requiredPattern,       currentValue
format           |  string   | requiredFormat,        currentValue
minimum          |  number   | minimumValue,          currentValue
exclusiveMinimum |  number   | exclusiveMinimumValue, currentValue
maximum          |  number   | maximumValue,          currentValue
exclusiveMaximum |  number   | exclusiveMaximumValue, currentValue
multipleOf       |  number   | multipleOfValue,       currentValue
minProperties    |  object   | minimumProperties,     currentProperties
maxProperties    |  object   | maximumProperties,     currentProperties
 dependencies  * |  object   | (varies, based on dependencies schema)
minItems         |  array    | minimumItems,          currentItems
maxItems         |  array    | maximumItems,          currentItems
uniqueItems      |  array    | duplicateItems
 contains      * |  array    | requiredItem

* Note: The `contains` and `dependencies` validators are still in development, and do not yet work correctly.

### Changing or adding widgets

To add a new widget or override an existing widget, either add an object containing your new widgets to the `widgets` input of the `<json-schema-form>` tag, or load the `WidgetLibraryService` and call `registerWidget(widgetType, widgetComponent)`, with a string type name and an Angular component to be used whenever a form needs that widget type.

Example:

```javascript
import { YourInputWidgetComponent } from './your-input-widget.component';
import { YourCustomWidgetComponent } from './your-custom-widget.component';
...
const yourNewWidgets = {
  input: YourInputWidgetComponent,          // Replace existing 'input' widget
  custom-control: YourCustomWidgetComponent // Add new 'custom-control' widget
}
```

...and...

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [widgets]="yourNewWidgets">
</json-schema-form>
```

...or...

```javascript
import { WidgetLibraryService } from '@ajsf/core';
...
constructor(private widgetLibrary: WidgetLibraryService) { }
...
// Replace existing 'input' widget:
widgetLibrary.registerWidget('input', YourInputWidgetComponent);
// Add new 'custom-control' widget:
widgetLibrary.registerWidget('custom-control', YourCustomWidgetComponent);
```

To see many examples of widgets, explore the source code, or call `getAllWidgets()` from the `WidgetLibraryService` to see all widgets currently available in the library. All default widget components are in the `projects/json-schema-form/src/lib/widget-library` folder, and all custom Material Design widget components are in the `projects/json-schema-form/src/lib/framework-library/material-design-framework` folder. (The Bootstrap 3 and Bootstrap 4 frameworks just reformat the default widgets, and so do not include any custom widgets of their own.)

### Changing or adding frameworks

To change the active framework, either use the `framework` input of the `<json-schema-form>` tag, or load the `FrameworkLibraryService` and call `setFramework(yourCustomFramework)`, with either the name of an available framework ('bootstrap-3', 'bootstrap-4', 'material-design', or 'no-framework'), or with your own custom framework object, like so:

```javascript
import { YourFrameworkComponent } from './your-framework.component';
import { YourWidgetComponent } from './your-widget.component';
...
const yourCustomFramework = {
  framework: YourFrameworkComponent,                                // required
  widgets:     { 'your-widget-name': YourWidgetComponent,   ... },  // optional
  stylesheets: [ '//url-to-framework-external-style-sheet', ... ],  // optional
  scripts:     [ '//url-to-framework-external-script',      ... ]   // optional
}
```

...and...

```html
<json-schema-form
  [schema]="yourJsonSchema"
  [framework]="yourCustomFramework">
</json-schema-form>
```

...or...

```javascript
import { FrameworkLibraryService } from '@ajsf/core';
...
constructor(private frameworkLibrary: FrameworkLibraryService) { }
...
frameworkLibrary.setFramework(yourCustomFramework);
```

The value of the required `framework` key is an Angular component which will be called to format each widget before it is displayed. The optional `widgets` object contains any custom widgets, which will override or supplement the built-in widgets. And the optional `stylesheets` and `scripts` arrays contain URLs to any additional external style sheets or JavaScript libraries required by the framework. These are the external stylesheets and scripts that will be loaded if the "loadExternalAssets" option is set to "true".

#### Loading external assets required by a framework

Most Web layout framework libraries (including both Bootstrap and Material Design) need additional external JavaScript and/or CSS assets loaded in order to work properly. The best practice is to load these assets separately in your site, before calling Angular JSON Schema Form. (For the included libraries, follow these links for more information about how to do this: [Bootstrap](http://getbootstrap.com/getting-started/) and [Material Design](https://github.com/angular/material2/blob/master/GETTING_STARTED.md).)

Alternately, during development, you may find it helpful to let Angular JSON Schema Form load these resources for you (as wed did in the 'Basic use' example, above), which you can do in several ways:

* Call `setFramework` with a second parameter of `true` (e.g. `setFramework('material-design', true)`), or
* Add `loadExternalAssets: true` to your `options` object, or
* Add `loadExternalAssets="true"` to your `<json-schema-form>` tag, as shown above

Finally, if you want to see what scripts a particular framework will automatically load, after setting that framework you can call `getFrameworkStylesheets()` or `getFrameworkScritps()` from the `FrameworkLibraryService` to return the built-in arrays of URLs.

However, if you are creating a production site you should load these assets separately, and make sure to remove all references to `loadExternalAssets` to prevent the assets from being loaded twice.

## contributing guide

If you like this project and want to contribute you can check this [documentation](./CONTRIBUTING.md).

## License

[MIT](/LICENSE)


================================================
FILE: angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "demo": {
      "root": "",
      "sourceRoot": "demo",
      "projectType": "application",
      "prefix": "app",
      "schematics": {},
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/demo",
            "index": "demo/index.html",
            "main": "demo/main.ts",
            "polyfills": "demo/polyfills.ts",
            "tsConfig": "demo/tsconfig.app.json",
            "assets": [
              "demo/favicon.ico",
              "demo/assets"
            ],
            "styles": [
              "demo/styles.scss"
            ],
            "scripts": [],
            "vendorChunk": true,
            "extractLicenses": false,
            "buildOptimizer": false,
            "sourceMap": true,
            "optimization": false,
            "namedChunks": true
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "demo/environments/environment.ts",
                  "with": "demo/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true
            }
          },
          "defaultConfiguration": ""
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "demo:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "demo:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "demo:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "demo/test.ts",
            "polyfills": "demo/polyfills.ts",
            "tsConfig": "demo/tsconfig.spec.json",
            "karmaConfig": "demo/karma.conf.js",
            "styles": [
              "demo/styles.scss"
            ],
            "scripts": [],
            "assets": [
              "demo/favicon.ico",
              "demo/assets"
            ]
          }
        }
      }
    },
    "demo-e2e": {
      "root": "e2e/",
      "projectType": "application",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "demo:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "demo:serve:production"
            }
          }
        }
      }
    },
    "@ajsf/core": {
      "root": "projects/ajsf-core",
      "sourceRoot": "projects/ajsf-core/src",
      "projectType": "library",
      "prefix": "",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:ng-packagr",
          "options": {
            "tsConfig": "projects/ajsf-core/tsconfig.lib.json",
            "project": "projects/ajsf-core/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "projects/ajsf-core/tsconfig.lib.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/ajsf-core/src/test.ts",
            "tsConfig": "projects/ajsf-core/tsconfig.spec.json",
            "karmaConfig": "projects/ajsf-core/karma.conf.js"
          }
        }
      }
    },
    "@ajsf/bootstrap4": {
      "projectType": "library",
      "root": "projects/ajsf-bootstrap4",
      "sourceRoot": "projects/ajsf-bootstrap4/src",
      "prefix": "",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:ng-packagr",
          "options": {
            "tsConfig": "projects/ajsf-bootstrap4/tsconfig.lib.json",
            "project": "projects/ajsf-bootstrap4/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "projects/ajsf-bootstrap4/tsconfig.lib.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/ajsf-bootstrap4/src/test.ts",
            "tsConfig": "projects/ajsf-bootstrap4/tsconfig.spec.json",
            "karmaConfig": "projects/ajsf-bootstrap4/karma.conf.js"
          }
        }
      }
    },
    "@ajsf/bootstrap3": {
      "projectType": "library",
      "root": "projects/ajsf-bootstrap3",
      "sourceRoot": "projects/ajsf-bootstrap3/src",
      "prefix": "",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:ng-packagr",
          "options": {
            "tsConfig": "projects/ajsf-bootstrap3/tsconfig.lib.json",
            "project": "projects/ajsf-bootstrap3/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "projects/ajsf-bootstrap3/tsconfig.lib.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/ajsf-bootstrap3/src/test.ts",
            "tsConfig": "projects/ajsf-bootstrap3/tsconfig.spec.json",
            "karmaConfig": "projects/ajsf-bootstrap3/karma.conf.js"
          }
        }
      }
    },
    "@ajsf/material": {
      "projectType": "library",
      "root": "projects/ajsf-material",
      "sourceRoot": "projects/ajsf-material/src",
      "prefix": "",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:ng-packagr",
          "options": {
            "tsConfig": "projects/ajsf-material/tsconfig.lib.json",
            "project": "projects/ajsf-material/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "projects/ajsf-material/tsconfig.lib.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/ajsf-material/src/test.ts",
            "tsConfig": "projects/ajsf-material/tsconfig.spec.json",
            "karmaConfig": "projects/ajsf-material/karma.conf.js"
          }
        }
      }
    }
  },
  "defaultProject": "demo",
  "schematics": {
    "@schematics/angular:component": {
      "style": "scss"
    }
  }
}

================================================
FILE: demo/app/ace-editor.directive.ts
================================================
import { Directive, ElementRef, EventEmitter, Input, Output } from '@angular/core';
import ace from 'brace';
import 'brace/mode/json';
import 'brace/theme/sqlserver';



@Directive({
  // tslint:disable-next-line:directive-selector
  selector: '[ace-editor]'
})
export class AceEditorDirective {
  _options: any = {};
  _highlightActiveLine = false;
  _showGutter = false;
  _readOnly = false;
  _theme = 'sqlserver';
  _mode = 'json';
  _autoUpdateContent = true;
  editor: any;
  oldText: any;
  @Output('textChanged') textChanged = new EventEmitter();

  constructor(elementRef: ElementRef) {
    const el = elementRef.nativeElement;
    this.editor = ace.edit(el);
    this.init();
    this.initEvents();
  }

  init() {
    this.editor.getSession().setUseWorker(false);
    this.editor.setOptions(this._options);
    this.editor.setTheme(`ace/theme/${this._theme}`);
    this.editor.getSession().setMode(`ace/mode/${this._mode}`);
    this.editor.setHighlightActiveLine(this._highlightActiveLine);
    this.editor.renderer.setShowGutter(this._showGutter);
    this.editor.setReadOnly(this._readOnly);
    this.editor.$blockScrolling = Infinity;
  }

  initEvents() {
    this.editor.on('change', () => {
      const newVal = this.editor.getValue();
      if (this.oldText) {
        this.textChanged.emit(newVal);
      }
      this.oldText = newVal;
    });
  }

  @Input() set options(options: any) {
    this._options = options;
    this.editor.setOptions(options || {});
  }

  @Input() set readOnly(readOnly: any) {
    this._readOnly = readOnly;
    this.editor.setReadOnly(readOnly);
  }

  @Input() set theme(theme: any) {
    this._theme = theme;
    this.editor.setTheme(`ace/theme/${theme}`);
  }

  @Input() set mode(mode: any) {
    this._mode = mode;
    this.editor.getSession().setMode(`ace/mode/${mode}`);
  }

  @Input() set text(text: any) {
    if (!text) { text = ''; }

    if (this._autoUpdateContent === true) {
      this.editor.setValue(text);
      this.editor.clearSelection();
      this.editor.focus();
      this.editor.moveCursorTo(0, 0);
    }
  }

  @Input() set autoUpdateContent(status: any) {
    this._autoUpdateContent = status;
  }
}


================================================
FILE: demo/app/demo-root.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  // tslint:disable-next-line:component-selector
  selector: 'demo-root',
  template: `<router-outlet></router-outlet>`
})
export class DemoRootComponent { }


================================================
FILE: demo/app/demo.component.html
================================================
<div class="demo-page-header">
  <mat-toolbar class="mat-elevation-z4 mat-medium" color="primary">
    Angular JSON Schema Form — Demonstration Playground
  </mat-toolbar>
  <div class="header-content">
    An Angular <a href="http://json-schema.org/">JSON Schema</a> Form builder
    for Angular, similar to, and mostly API compatible with,
    <span class="avoidwrap">
      <!-- JSON Schema Form's Angular Schema Form -->
      <!-- https://github.com/json-schema-form -->
      <!-- http://schemaform.io -->
      <a href="http://schemaform.io/examples/bootstrap-example.html">Angular Schema Form</a>,
      <!-- Mozilla's React JSON Schema Form -->
      <!-- https://github.com/mozilla-services/react-jsonschema-form -->
      <a href="https://mozilla-services.github.io/react-jsonschema-form/">React JSON Schema Form</a>,
      and
      <!-- Joshfire's JSON Form -->
      <!-- http://factory.joshfire.com/ -->
      <!-- http://github.com/joshfire/jsonform/wiki -->
      <a href="http://ulion.github.io/jsonform/playground/">JSON Form</a>.
    </span><br>
    Choose an example, or create your own, and check out the generated form.<br><br>

    <span class="menu-label">Current example:</span>
    <button mat-raised-button
      color="primary"
      [matMenuTriggerFor]="exampleMenu">
      <mat-icon>menu</mat-icon> {{selectedSetName}} {{selectedExampleName}}
    </button>
    <mat-menu #exampleMenu="matMenu" class="example-menu">
      <button mat-menu-item class="mat-medium"
        *ngFor="let example of examples['ng-jsf'].schemas"
        (click)="loadSelectedExample('ng-jsf', '', example.file, example.name)">
        {{example.name}}
      </button>
      <button mat-menu-item class="mat-medium" [matMenuTriggerFor]="asfMenu">
        <span>Angular Schema Form (AngularJS) examples</span>
      </button>
      <mat-menu #asfMenu="matMenu" class="example-menu">
        <button mat-menu-item class="mat-medium"
          *ngFor="let example of examples.asf.schemas"
          (click)="loadSelectedExample('asf', 'Angular Schema Form:', example.file, example.name)">
          {{example.name}}
        </button>
      </mat-menu>
      <button mat-menu-item class="mat-medium" [matMenuTriggerFor]="rjsfMenu">
        <span>React JSON Schema Form examples</span>
      </button>
      <mat-menu #rjsfMenu="matMenu" class="example-menu">
        <button mat-menu-item class="mat-medium"
          *ngFor="let example of examples.rjsf.schemas"
          (click)="loadSelectedExample('rjsf', 'React JSON Schema Form:', example.file, example.name)">
          {{example.name}}
        </button>
      </mat-menu>
      <button mat-menu-item class="mat-medium" [matMenuTriggerFor]="jsfMenu">
        <span>JSONForm (jQuery) examples</span>
      </button>
      <mat-menu #jsfMenu="matMenu" class="example-menu">
        <button mat-menu-item class="mat-medium"
          *ngFor="let example of examples.jsf.schemas"
          (click)="loadSelectedExample('jsf', 'JSONForm:', example.file, example.name)">
          {{example.name}}
        </button>
      </mat-menu>
    </mat-menu>
  </div>
</div>
<div fxLayout="row" fxLayoutAlign="space-around start"
  fxLayout.lt-sm="column" fxLayoutAlign.lt-sm="flex-start center">

  <mat-card fxFlex="0 0 calc(50% - 12px)">
    <h4 class="default-cursor" (click)="toggleVisible('options')">
      {{visible.options ? '▼' : '▶'}} Selected Framework and Options
    </h4>
    <div *ngIf="visible.options" fxLayout="column" [@expandSection]="true">
      <mat-form-field>
        <mat-select
          [(ngModel)]="selectedFramework"
          name="framework"
          placeholder="Framework">
          <mat-option
            *ngFor="let framework of frameworkList"
            [value]="framework">
            {{frameworks[framework]}}
          </mat-option>
        </mat-select>
      </mat-form-field>
      <mat-form-field>
        <mat-select
          [(ngModel)]="selectedLanguage"
          (selectionChange)="loadSelectedLanguage()"
          name="language"
          placeholder="Language">
          <mat-option
            *ngFor="let language of languageList"
            [value]="language">
            {{languages[language]}}
          </mat-option>
        </mat-select>
      </mat-form-field>
      <div class="check-row">
        <mat-checkbox color="primary" [(ngModel)]="jsonFormOptions.returnEmptyFields">
          Return empty fields?
        </mat-checkbox>
        (default = true)
      </div>
      <div class="check-row">
        <mat-checkbox color="primary" [(ngModel)]="jsonFormOptions.addSubmit">
          Add submit button?
        </mat-checkbox>
        (default = only add if no layout is defined)
      </div>
      <div class="check-row">
        <mat-checkbox color="primary" [(ngModel)]="jsonFormOptions.defautWidgetOptions.feedback">
          Show inline fedback?
        </mat-checkbox>
        (default = false)
      </div>
      <div class="check-row">
        <mat-checkbox color="primary" [(ngModel)]="jsonFormOptions.debug">
          Show debuging information?
        </mat-checkbox>
        (default = false)
      </div>
    </div>
    <hr>
    <h4 class="default-cursor" (click)="toggleVisible('schema')">
      {{visible.schema ? '▼' : '▶'}} Input JSON Schema and Form Layout
    </h4>
    <div *ngIf="visible.schema" [@expandSection]="true"
      ace-editor
      [text]="jsonFormSchema"
      [options]="aceEditorOptions"
      [readOnly]="false"
      [autoUpdateContent]="true"
      (textChanged)="generateForm($event)"
      style="width:100%; overflow: auto; border: 1px solid black;">
      (loading form specification...)
    </div>
  </mat-card>

  <mat-card fxFlex="0 0 calc(50% - 12px)">
    <h4 class="default-cursor" (click)="toggleVisible('form')">
      {{visible.form ? '▼' : '▶'}} Generated Form
    </h4>
    <div *ngIf="visible.form" class="json-schema-form" [@expandSection]="true">
      <div *ngIf="!formActive">{{jsonFormStatusMessage}}</div>

      <!-- This is the form! -->
      <json-schema-form
        *ngIf="formActive"
        loadExternalAssets="true"
        [form]="jsonFormObject"
        [options]="jsonFormOptions"
        [framework]="selectedFramework"
        [language]="selectedLanguage"
        (onChanges)="onChanges($event)"
        (onSubmit)="onSubmit($event)"
        (isValid)="isValid($event)"
        (validationErrors)="validationErrors($event)">
      </json-schema-form>

    </div>
    <hr>
    <h4 class="default-cursor" (click)="toggleVisible('output')">
      {{visible.output ? '▼' : '▶'}} Form Output
    </h4>
    <div *ngIf="visible.output" fxLayout="column" [@expandSection]="true">
      <div>
        Valid?:
        <strong *ngIf="formIsValid || prettyValidationErrors"
          [class.text-success]="formIsValid"
          [class.text-danger]="!formIsValid">
          {{formIsValid ? 'Yes' : 'No'}}
        </strong>
        <span *ngIf="!formIsValid && !prettyValidationErrors">n/a</span>
        <span *ngIf="prettyValidationErrors">— errors from validationErrors():</span>
        <div *ngIf="prettyValidationErrors"
          class="data-bad"
          [innerHTML]="prettyValidationErrors"></div>
      </div><br>
      <div>
        Live data — from onChanges():
        <pre
          [class.data-good]="!prettyValidationErrors && prettyLiveFormData !== '{}'"
          [class.data-bad]="prettyValidationErrors">{{prettyLiveFormData}}</pre>
      </div><br>
      <div>
        Submitted data — from onSubmit():
        <pre [class.data-good]="prettySubmittedFormData !== 'null'">{{prettySubmittedFormData}}</pre>
      </div>
    </div>
  </mat-card>

</div>


================================================
FILE: demo/app/demo.component.ts
================================================
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatMenuTrigger } from '@angular/material/menu';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { ActivatedRoute, Router } from '@angular/router';
import { HttpClient } from '@angular/common/http';

import { Examples } from './example-schemas.model';
import { JsonPointer } from '@ajsf/core';

@Component({
  // tslint:disable-next-line:component-selector
  selector: 'demo',
  templateUrl: 'demo.component.html',
  animations: [
    trigger('expandSection', [
      state('in', style({ height: '*' })),
      transition(':enter', [
        style({ height: 0 }), animate(100),
      ]),
      transition(':leave', [
        style({ height: '*' }),
        animate(100, style({ height: 0 })),
      ]),
    ]),
  ],
})
export class DemoComponent implements OnInit {
  examples: any = Examples;
  languageList: any = ['de', 'en', 'es', 'fr', 'it', 'pt', 'zh'];
  languages: any = {
    'de': 'German',
    'en': 'English',
    'es': 'Spanish',
    'fr': 'French',
    'it': 'Italian',
    'pt': 'Portuguese',
    'zh': 'Chinese'
  };
  frameworkList: any = ['material-design', 'bootstrap-3', 'bootstrap-4', 'no-framework'];
  frameworks: any = {
    'material-design': 'Material Design',
    'bootstrap-3': 'Bootstrap 3',
    'bootstrap-4': 'Bootstrap 4',
    'no-framework': 'None (plain HTML)',
  };
  selectedSet = 'ng-jsf';
  selectedSetName = '';
  selectedExample = 'ng-jsf-flex-layout';
  selectedExampleName = 'Flexbox layout';
  selectedFramework = 'material-design';
  selectedLanguage = 'en';
  visible = {
    options: true,
    schema: true,
    form: true,
    output: true
  };

  formActive = false;
  jsonFormSchema: string;
  jsonFormValid = false;
  jsonFormStatusMessage = 'Loading form...';
  jsonFormObject: any;
  jsonFormOptions: any = {
    addSubmit: true, // Add a submit button if layout does not have one
    debug: false, // Don't show inline debugging information
    loadExternalAssets: true, // Load external css and JavaScript for frameworks
    returnEmptyFields: false, // Don't return values for empty input fields
    setSchemaDefaults: true, // Always use schema defaults for empty fields
    defautWidgetOptions: { feedback: true }, // Show inline feedback icons
  };
  liveFormData: any = {};
  formValidationErrors: any;
  formIsValid = null;
  submittedFormData: any = null;
  aceEditorOptions: any = {
    highlightActiveLine: true,
    maxLines: 1000,
    printMargin: false,
    autoScrollEditorIntoView: true,
  };
  @ViewChild(MatMenuTrigger, { static: true }) menuTrigger: MatMenuTrigger;

  constructor(
    private http: HttpClient,
    private route: ActivatedRoute,
    private router: Router
  ) { }

  ngOnInit() {
    // Subscribe to query string to detect schema to load
    this.route.queryParams.subscribe(
      params => {
        if (params['set']) {
          this.selectedSet = params['set'];
          this.selectedSetName = ({
            'ng-jsf': '',
            'asf': 'Angular Schema Form:',
            'rsf': 'React Schema Form:',
            'jsf': 'JSONForm:'
          })[this.selectedSet];
        }
        if (params['example']) {
          this.selectedExample = params['example'];
          this.selectedExampleName = this.examples[this.selectedSet].schemas
            .find(schema => schema.file === this.selectedExample).name;
        }
        if (params['framework']) {
          this.selectedFramework = params['framework'];
        }
        if (params['language']) {
          this.selectedLanguage = params['language'];
        }
        this.loadSelectedExample();
      }
    );
  }

  onSubmit(data: any) {
    this.submittedFormData = data;
  }

  get prettySubmittedFormData() {
    return JSON.stringify(this.submittedFormData, null, 2);
  }

  onChanges(data: any) {
    this.liveFormData = data;
  }

  get prettyLiveFormData() {
    return JSON.stringify(this.liveFormData, null, 2);
  }

  isValid(isValid: boolean): void {
    this.formIsValid = isValid;
  }

  validationErrors(data: any): void {
    this.formValidationErrors = data;
  }

  get prettyValidationErrors() {
    if (!this.formValidationErrors) { return null; }
    const errorArray = [];
    for (const error of this.formValidationErrors) {
      const message = error.message;
      const dataPathArray = JsonPointer.parse(error.dataPath);
      if (dataPathArray.length) {
        let field = dataPathArray[0];
        for (let i = 1; i < dataPathArray.length; i++) {
          const key = dataPathArray[i];
          field += /^\d+$/.test(key) ? `[${key}]` : `.${key}`;
        }
        errorArray.push(`${field}: ${message}`);
      } else {
        errorArray.push(message);
      }
    }
    return errorArray.join('<br>');
  }

  loadSelectedExample(
    selectedSet: string = this.selectedSet,
    selectedSetName: string = this.selectedSetName,
    selectedExample: string = this.selectedExample,
    selectedExampleName: string = this.selectedExampleName
  ) {
    if (this.menuTrigger.menuOpen) { this.menuTrigger.closeMenu(); }
    if (selectedExample !== this.selectedExample) {
      this.formActive = false;
      this.selectedSet = selectedSet;
      this.selectedSetName = selectedSetName;
      this.selectedExample = selectedExample;
      this.selectedExampleName = selectedExampleName;
      this.router.navigateByUrl(
        '/?set=' + selectedSet +
        '&example=' + selectedExample +
        '&framework=' + this.selectedFramework +
        '&language=' + this.selectedLanguage
      );
      this.liveFormData = {};
      this.submittedFormData = null;
      this.formIsValid = null;
      this.formValidationErrors = null;
    }
    const exampleURL = `assets/example-schemas/${this.selectedExample}.json`;
    this.http
      .get(exampleURL, { responseType: 'text' })
      .subscribe(schema => {
        this.jsonFormSchema = schema;
        this.generateForm(this.jsonFormSchema);
      });
  }

  loadSelectedLanguage() {
    window.location.href = `${window.location.pathname}?set=${this.selectedSet}&example=${this.selectedExample}&framework=${this.selectedFramework}&language=${this.selectedLanguage}`;
  }

  // Display the form entered by the user
  // (runs whenever the user changes the jsonform object in the ACE input field)
  generateForm(newFormString: string) {
    if (!newFormString) { return; }
    this.jsonFormStatusMessage = 'Loading form...';
    this.formActive = false;
    this.liveFormData = {};
    this.submittedFormData = null;

    // Most examples should be written in pure JSON,
    // but if an example schema includes a function,
    // it will be compiled it as Javascript instead
    try {

      // Parse entered content as JSON
      this.jsonFormObject = JSON.parse(newFormString);
      this.jsonFormValid = true;
    } catch (jsonError) {
      try {

        // If entered content is not valid JSON,
        // parse as JavaScript instead to include functions
        const newFormObject: any = null;
        /* tslint:disable */
        eval('newFormObject = ' + newFormString);
        /* tslint:enable */
        this.jsonFormObject = newFormObject;
        this.jsonFormValid = true;
      } catch (javascriptError) {

        // If entered content is not valid JSON or JavaScript, show error
        this.jsonFormValid = false;
        this.jsonFormStatusMessage =
          'Entered content is not currently a valid JSON Form object.\n' +
          'As soon as it is, you will see your form here. So keep typing. :-)\n\n' +
          'JavaScript parser returned:\n\n' + jsonError;
        return;
      }
    }
    this.formActive = true;
  }

  toggleVisible(item: string) {
    this.visible[item] = !this.visible[item];
  }

  toggleFormOption(option: string) {
    if (option === 'feedback') {
      this.jsonFormOptions.defautWidgetOptions.feedback =
        !this.jsonFormOptions.defautWidgetOptions.feedback;
    } else {
      this.jsonFormOptions[option] = !this.jsonFormOptions[option];
    }
    this.generateForm(this.jsonFormSchema);
  }
}


================================================
FILE: demo/app/demo.module.ts
================================================
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule } from '@angular/router';
import { FlexLayoutModule } from '@angular/flex-layout';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatSelectModule } from '@angular/material/select';
import { MatToolbarModule } from '@angular/material/toolbar';
import { AceEditorDirective } from './ace-editor.directive';
import { DemoComponent } from './demo.component';
import { DemoRootComponent } from './demo-root.component';
import { routes } from './demo.routes';
import { JsonSchemaFormModule } from '@ajsf/core';
import { Bootstrap4FrameworkModule } from '@ajsf/bootstrap4';
import { Bootstrap3FrameworkModule } from '@ajsf/bootstrap3';
import { MaterialDesignFrameworkModule } from '@ajsf/material';

@NgModule({
  declarations: [AceEditorDirective, DemoComponent, DemoRootComponent],
  imports: [
    BrowserModule, BrowserAnimationsModule, FlexLayoutModule, FormsModule,
    HttpClientModule, MatButtonModule, MatCardModule, MatCheckboxModule,
    MatIconModule, MatMenuModule, MatSelectModule, MatToolbarModule,
    RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }),
    Bootstrap4FrameworkModule,
    Bootstrap3FrameworkModule,
    MaterialDesignFrameworkModule,
    JsonSchemaFormModule
  ],
  bootstrap: [DemoRootComponent]
})

export class DemoModule { }


================================================
FILE: demo/app/demo.routes.ts
================================================
import { Route } from '@angular/router';

import { DemoComponent } from './demo.component';

export const routes: Route[] = [
  { path: '', component: DemoComponent },
  { path: '**', component: DemoComponent }
];


================================================
FILE: demo/app/example-schemas.model.ts
================================================
/**
 * Sources:
 *
 * Angular JSON Schema Form examples ('ng-jsf-...') are original
 *
 * JSON Meta-Schemas ('json-schema-...') are from
 *   http://json-schema.org/specification-links.html
 *
 * Angular Schema Form (AngularJS) examples ('asf-...') are from
 *   http://schemaform.io/examples/bootstrap-example.html
 *
 * React JSON Schema Form examples ('rjsf-...') are from
 *   https://mozilla-services.github.io/react-jsonschema-form/
 *
 * JSONForm (jQuery) examples ('jsf-...') are from
 *   http://ulion.github.io/jsonform/playground/
 */

export const Examples: any = {
  'ng-jsf': {
    name: 'Angular JSON Schema Form examples',
    schemas: [
      { name: 'Flexbox layout',                  file: 'ng-jsf-flex-layout', },
      // { name: 'Simple Array',                    file: 'ng-jsf-simple-array', },
      { name: 'Nested Arrays',                   file: 'ng-jsf-nested-arrays', },
      { name: 'Deep Recursive References',       file: 'ng-jsf-deep-ref', },
      { name: 'Select Control Lists',            file: 'ng-jsf-select-list-examples', },
      // { name: 'Select Control Widgets',          file: 'ng-jsf-select-widget-examples', },
      { name: 'Data Only (no Schema or Layout)', file: 'ng-jsf-data-only', },
      // { name: 'Layout Only (no Schema or Data)', file: 'ng-jsf-layout-only', },
      // { name: 'JSON Meta-Schema - Draft 6',    file: 'json-schema-draft06', },
      // { name: 'JSON Meta-Schema - Draft 4',    file: 'json-schema-draft04', },
      // { name: 'JSON Meta-Schema - Draft 3',    file: 'json-schema-draft03', },
      // { name: 'JSON Meta-Schema - Draft 2',    file: 'json-schema-draft02', },
      // { name: 'JSON Meta-Schema - Draft 1',    file: 'json-schema-draft01', },
    ]
  },
  'asf': {
    name: 'Angular Schema Form (AngularJS) examples',
    url: 'http://schemaform.io/examples/bootstrap-example.html',
    schemas: [
      { name: 'Simple',                     file: 'asf-simple', },
      { name: 'Basic JSON Schema Type',     file: 'asf-basic-json-schema-type', },
      { name: 'Bootstrap Grid',             file: 'asf-bootstrap-grid', },
      { name: 'Complex Key Support',        file: 'asf-complex-key-support', },
      { name: 'Array',                      file: 'asf-array', },
      { name: 'Tab Array',                  file: 'asf-tab-array', },
      { name: 'TitleMap Examples',          file: 'asf-titlemap-examples', },
      { name: 'Kitchen Sink',               file: 'asf-kitchen-sink', },
      { name: 'Hack: Conditional Required', file: 'asf-hack-conditional-required', },
    ]
  },
  'rjsf': {
    name: 'React JSON Schema Form examples',
    url: 'https://mozilla-services.github.io/react-jsonschema-form/',
    schemas: [
      { name: 'Simple',                     file: 'rjsf-simple', },
      { name: 'Nested',                     file: 'rjsf-nested', },
      { name: 'Arrays',                     file: 'rjsf-arrays', },
      { name: 'Numbers',                    file: 'rjsf-numbers', },
      { name: 'Widgets',                    file: 'rjsf-widgets', },
      { name: 'Ordering',                   file: 'rjsf-ordering', },
      { name: 'References',                 file: 'rjsf-references', },
      { name: 'Custom',                     file: 'rjsf-custom', },
      { name: 'Errors',                     file: 'rjsf-errors', },
      { name: 'Large',                      file: 'rjsf-large', },
      { name: 'Date & Time',                file: 'rjsf-date-and-time', },
      { name: 'Validation',                 file: 'rjsf-validation', },
      { name: 'Files',                      file: 'rjsf-files', },
      { name: 'Single',                     file: 'rjsf-single', },
      // { name: 'Custom Array',               file: 'rjsf-custom-array', },
      { name: 'Alternatives',               file: 'rjsf-alternatives', },
    ]
  },
  'jsf': {
    name: 'JSONForm (jQuery) examples',
    url: 'http://ulion.github.io/jsonform/playground/',
    schemas: [
      { name: 'Getting started',
        file: 'jsf-gettingstarted', urlParameters: '?example=gettingstarted' },
      { name: 'JSON Schema - A basic example',
        file: 'jsf-schema-basic', urlParameters: '?example=schema-basic', },
      { name: 'JSON Schema - Slightly more complex example',
        file: 'jsf-schema-morecomplex', urlParameters: '?example=schema-morecomplex', },
      { name: 'JSON Schema - Arrays',
        file: 'jsf-schema-array', urlParameters: '?example=schema-array', },
      { name: 'JSON Schema - Required field',
        file: 'jsf-schema-required', urlParameters: '?example=schema-required', },
      { name: 'JSON Schema - Default values',
        file: 'jsf-schema-default', urlParameters: '?example=schema-default', },
      { name: 'JSON Schema - Inline $ref to definitions',
        file: 'jsf-schema-inlineref', urlParameters: '?example=schema-inlineref', },
      { name: 'Fields - Common properties',
        file: 'jsf-fields-common', urlParameters: '?example=fields-common', },
      { name: 'Fields - Gathering secrets: the password type',
        file: 'jsf-fields-password', urlParameters: '?example=fields-password', },
      { name: 'Fields - Large text: the textarea type',
        file: 'jsf-fields-textarea', urlParameters: '?example=fields-textarea', },
      { name: 'Fields - text field with jquery-ui autocomplete',
        file: 'jsf-fields-autocomplete', urlParameters: '?example=fields-autocomplete', },
      { name: 'Fields - Code (JavaScript, JSON...): the ace type',
        file: 'jsf-fields-ace', urlParameters: '?example=fields-ace', },
      { name: 'Fields - Color picker: the color type',
        file: 'jsf-fields-color', urlParameters: '?example=fields-color', },
      { name: 'Fields - Boolean flag: the checkbox type',
        file: 'jsf-fields-checkbox', urlParameters: '?example=fields-checkbox', },
      { name: 'Fields - Multiple options: the checkboxes type',
        file: 'jsf-fields-checkboxes', urlParameters: '?example=fields-checkboxes', },
      { name: 'Fields - Selection list: the select type',
        file: 'jsf-fields-select', urlParameters: '?example=fields-select', },
      { name: 'Fields - A list of radio buttons: the radios type',
        file: 'jsf-fields-radios', urlParameters: '?example=fields-radios', },
      { name: 'Fields - Radio buttons as real buttons: the radio buttons type',
        file: 'jsf-fields-radiobuttons', urlParameters: '?example=fields-radiobuttons', },
      { name: 'Fields - Checkbox buttons: the checkbox buttons type',
        file: 'jsf-fields-checkboxbuttons', urlParameters: '?example=fields-checkboxbuttons', },
      { name: 'Fields - Number: the range type',
        file: 'jsf-fields-range', urlParameters: '?example=fields-range', },
      { name: 'Fields - Image selector: the imageselect type',
        file: 'jsf-fields-imageselect', urlParameters: '?example=fields-imageselect', },
      { name: 'Fields - Icon selector: the iconselect type',
        file: 'jsf-fields-iconselect', urlParameters: '?example=fields-iconselect', },
      { name: 'Fields - Grouping: the fieldset type',
        file: 'jsf-fields-fieldset', urlParameters: '?example=fields-fieldset', },
      { name: 'Fields - Advanced options section: the advancedfieldset type',
        file: 'jsf-fields-advancedfieldset', urlParameters: '?example=fields-advancedfieldset', },
      { name: 'Fields - Authentication settings section: the authfieldset type',
        file: 'jsf-fields-authfieldset', urlParameters: '?example=fields-authfieldset', },
      { name: 'Fields - Generic group: the section type',
        file: 'jsf-fields-section', urlParameters: '?example=fields-section', },
      { name: 'Fields - Group of buttons: the actions type',
        file: 'jsf-fields-actions', urlParameters: '?example=fields-actions', },
      { name: 'Fields - Generic array: the array type (complex)',
        file: 'jsf-fields-array', urlParameters: '?example=fields-array', },
      { name: 'Fields - Generic array: the array type (simple)',
        file: 'jsf-fields-array-simple', urlParameters: '?example=fields-array-simple', },
      { name: 'Fields - Arrays with tabs: the tabarray type',
        file: 'jsf-fields-tabarray', urlParameters: '?example=fields-tabarray', },
      { name: 'Fields - Arrays with tabs: the tabarray type w/ maxItems',
        file: 'jsf-fields-tabarray-maxitems', urlParameters: '?example=fields-tabarray-maxitems', },
      { name: 'Fields - Arrays with tabs: the tabarray type w/ default & legend',
        file: 'jsf-fields-tabarray-value', urlParameters: '?example=fields-tabarray-value', },
      { name: 'Fields - Alternative: the selectfieldset type',
        file: 'jsf-fields-selectfieldset', urlParameters: '?example=fields-selectfieldset', },
      { name: 'Fields - Alternative with schema key',
        file: 'jsf-fields-selectfieldset-key', urlParameters: '?example=fields-selectfieldset-key', },
      { name: 'Fields - Submit the form: the submit type',
        file: 'jsf-fields-submit', urlParameters: '?example=fields-submit', },
      { name: 'Fields - Guide users: the help type',
        file: 'jsf-fields-help', urlParameters: '?example=fields-help', },
      { name: 'Fields - Hidden form values: the hidden type',
        file: 'jsf-fields-hidden', urlParameters: '?example=fields-hidden', },
      { name: 'Fields - Series of questions: the questions type',
        file: 'jsf-fields-questions', urlParameters: '?example=fields-questions', },
      { name: 'Templating - item index with idx',
        file: 'jsf-templating-idx', urlParameters: '?example=templating-idx', },
      { name: 'Templating - tab legend with value and valueInLegend',
        file: 'jsf-templating-value', urlParameters: '?example=templating-value', },
      { name: 'Templating - values.xxx to reference another field',
        file: 'jsf-templating-values', urlParameters: '?example=templating-values', },
      { name: 'Templating - Using the tpldata property',
        file: 'jsf-templating-tpldata', urlParameters: '?example=templating-tpldata', },
      { name: 'Using event handlers',
        file: 'jsf-events', urlParameters: '?example=events', },
      { name: 'Using previously submitted values',
        file: 'jsf-previousvalues', urlParameters: '?example=previousvalues', },
      { name: 'Using previously submitted values - Multidimensional arrays',
        file: 'jsf-previousvalues-multidimensional', urlParameters: '?example=previousvalues-multidimensional', },
    ]
  }
};


================================================
FILE: demo/assets/example-schemas/asf-array.json
================================================
{
  "schema": {
    "title": "Comment",
    "type": "object",
    "required": [ "comments" ],
    "properties": {
      "comments": {
        "type": "array",
        "maxItems": 2,
        "items": {
          "type": "object",
          "properties": {
            "name": {
              "title": "Name",
              "type": "string"
            },
            "email": {
              "title": "Email",
              "type": "string",
              "pattern": "^\\S+@\\S+$",
              "description": "Email will be used for evil."
            },
            "spam": {
              "title": "Spam",
              "type": "boolean",
              "default": true
            },
            "comment": {
              "title": "Comment",
              "type": "string",
              "maxLength": 20,
              "validationMessage": "Don't be greedy!"
            }
          },
          "required": [ "name", "comment" ]
        }
      }
    }
  },
  "form": [
    { "type": "help",
      "helpvalue": "<h4>Array Example</h4><p>Try adding a couple of forms, reorder by drag'n'drop.</p>"
    },
    { "key": "comments",
      "add": "New",
      "style": { "add": "btn-success" },
      "items": [
        "comments[].name",
        "comments[].email",
        { "title": "Yes I want spam.",
          "type": "checkbox",
          "key": "comments[].spam",
          "condition": "model.comments[arrayIndex].email"
        },
        { "type": "textarea",
          "key": "comments[].comment"
        }
      ]
    },
    { "title": "OK",
      "type": "submit",
      "style": "btn-info"
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/asf-basic-json-schema-type.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Types",
    "properties": {
      "string": {
        "type": "string",
        "minLength": 3
      },
      "integer": {
        "type": "integer"
      },
      "number": {
        "type": "number"
      },
      "boolean": {
        "type": "boolean"
      }
    },
    "required": [
      "number"
    ]
  }
}


================================================
FILE: demo/assets/example-schemas/asf-bootstrap-grid.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Comment",
    "properties": {
      "name": {
        "title": "Name",
        "type": "string"
      },
      "email": {
        "title": "Email",
        "type": "string",
        "pattern": "^\\S+@\\S+$",
        "description": "Email will be used for evil."
      },
      "comment": {
        "title": "Comment",
        "type": "string",
        "maxLength": 20,
        "validationMessage": "Don't be greedy!"
      }
    },
    "required": [
      "name",
      "email",
      "comment"
    ]
  },
  "form": [
    {
      "type": "help",
      "helpvalue": "<div class=\"alert alert-info\">Grid it up with bootstrap</div>"
    },
    {
      "type": "section",
      "htmlClass": "row",
      "items": [
        {
          "type": "section",
          "htmlClass": "col-xs-6",
          "items": [
            "name"
          ]
        },
        {
          "type": "section",
          "htmlClass": "col-xs-6",
          "items": [
            "email"
          ]
        }
      ]
    },
    {
      "key": "comment",
      "type": "textarea",
      "placeholder": "Make a comment"
    },
    {
      "type": "submit",
      "style": "btn-info",
      "title": "OK"
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/asf-complex-key-support.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Complex Key Support",
    "properties": {
      "a[\"b\"].c": { "type": "string" },
      "simple": {
        "type": "object",
        "properties": {
          "prøp": {
            "title": "UTF8 in both dot and bracket notation",
            "type": "string"
          }
        }
      },
      "array-key": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "a'rr[\"l": {
              "title": "Control Characters",
              "type": "string"
            },
            "˙∆∂∞˚¬": { "type": "string" }
          },
          "required": [ "a'rr[\"l", "˙∆∂∞˚¬" ]
        }
      }
    }
  },
  "form": [
    {
      "type": "help",
      "helpvalue": "Complex keys are supported in Angular 2+."
    },
    "['a[\"b\"].c']",
    {
      "key": "array-key",
      "items": [
        "['array-key'][]['a'rr[\"l']",
        {
          "key": "['array-key'][]['˙∆∂∞˚¬']",
          "title": "Unicode Characters"
        }
      ]
    },
    {
      "key": "simple",
      "items": [ "simple.prøp" ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/asf-hack-conditional-required.json
================================================
{
  "schema": {
    "type": "object",
    "properties": {
      "switch": {
        "title": "Spam me, please",
        "type": "boolean"
      },
      "email": {
        "title": "Email",
        "type": "string",
        "pattern": "^\\S+@\\S+$",
        "description": "Email will be used for evil."
      }
    },
    "required": [
      "switch"
    ]
  },
  "form": [
    {
      "type": "help",
      "helpvalue": "<p>Schema Form does not support oneOf (yet), but you can do a workaround and simulate certain scenarios with 'condition' and 'required'  (and/or 'readonly') in the form.</p>"
    },
    "switch",
    {
      "key": "email",
      "condition": "model.switch",
      "required": true
    },
    {
      "key": "email",
      "condition": "!model.switch"
    },
    {
      "type": "submit",
      "style": "btn-info",
      "title": "OK"
    }
  ]
}

================================================
FILE: demo/assets/example-schemas/asf-kitchen-sink.json
================================================
{
  "schema": {
    "type": "object",
    "required": [ "name", "shoesizeLeft" ],
    "properties": {
      "name": {
        "title": "Name",
        "description": "Gimme yea name lad",
        "type": "string",
        "pattern": "^[^/]*$",
        "minLength": 2
      },
      "invitation": {
        "type": "string",
        "format": "html",
        "title": "Invitation Design",
        "description": "Design the invitation in full technicolor HTML"
      },
      "favorite": {
        "title": "Favorite",
        "type": "string",
        "enum": [ "undefined", "null", "NaN" ]
      },
      "shoesizeLeft": {
        "title": "Shoe size (left)",
        "default": 42,
        "type": "number"
      },
      "shoesizeRight": {
        "title": "Shoe size (right)",
        "default": 42,
        "type": "number"
      },
      "attributes": {
        "type": "object",
        "title": "Attributes",
        "required": [ "eyecolor" ],
        "properties": {
          "eyecolor": {
            "type": "string",
            "format": "color",
            "title": "Eye color",
            "default": "pink"
          },
          "haircolor": {
            "type": "string",
            "title": "Hair color"
          },
          "shoulders": {
            "type": "object",
            "title": "Shoulders",
            "properties": {
              "left":  { "type": "string", "title": "Left"  },
              "right": { "type": "string", "title": "Right" }
            }
          }
        }
      },
      "things": {
        "type": "array",
        "title": "I like...",
        "items": {
          "type": "string",
          "enum": [ "clowns", "compiling", "sleeping" ]
        }
      },
      "dislike": {
        "type": "array",
        "title": "I dislike...",
        "items": {
          "type": "string",
          "title": "I hate"
        }
      },
      "soul": {
        "title": "Terms Of Service",
        "description": "I agree to sell my undying <a href='https://www.youtube.com/watch?v=dQw4w9WgXcQ'>soul</a>",
        "type": "boolean",
        "default": true
      },
      "soulserial": {
        "title": "Soul Serial No",
        "type": "string"
      },
      "date": {
        "title": "Date of party",
        "type": "string",
        "format": "date"
      },
      "radio": {
        "title": "Radio type",
        "type": "string",
        "enum": [ "Transistor", "Tube" ]
      },
      "radio2": {
        "title": "My Second Radio",
        "type": "string",
        "enum": [ "Transistor", "Tube" ]
      },
      "radiobuttons": {
        "type": "string",
        "enum": [ "Select me!", "No me!" ]
      }
    }
  },
  "form": [
    {
      "type": "fieldset",
      "title": "Stuff",
      "items": [
        {
          "type": "tabs",
          "tabs": [
            {
              "title": "Simple stuff",
              "items": [
                {
                  "key": "name",
                  "placeholder": "Check the console",
                  "onChange": "log(modelValue)",
                  "feedback": "{ 'glyphicon': true, 'glyphicon-ok': hasSuccess(), 'glyphicon-star': !hasSuccess() }"
                },
                { "key": "favorite", "feedback": false }
              ]
            },
            {
              "title": "More stuff",
              "items": [
                "attributes.eyecolor",
                "attributes.haircolor",
                {
                  "key": "attributes.shoulders.left",
                  "title": "Left shoulder",
                  "description": "This value is copied to attributes.shoulders.right in the model",
                  "copyValueTo": [ "attributes.shoulders.right" ]
                },
                {
                  "key": "shoesizeLeft",
                  "feedback": false,
                  "copyValueTo": [ "shoesizeRight" ]
                },
                { "key": "shoesizeRight" },
                {
                  "key": "invitation",
                  "tinymceOptions": {
                    "toolbar": [
                      "undo redo| styleselect | bold italic | link image",
                      "alignleft aligncenter alignright"
                    ]
                  }
                },
                "things",
                "dislike"
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "help",
      "helpvalue": "<hr>"
    },
    "soul",
    {
      "type": "conditional",
      "condition": "modelData.soul",
      "items": [ {
        "key": "soulserial",
        "placeholder": "ex. 666"
      } ]
    },
    {
      "key": "date",
      "minDate": "2014-06-20"
    },
    {
      "key": "radio",
      "type": "radios",
      "titleMap": [
        { "value": "Transistor", "name": "Transistor <br> Not the tube kind." },
        { "value": "Tube", "name": "Tube <br> The tube kind." }
      ]
    },
    {
      "key": "radio2",
      "type": "radios-inline",
      "titleMap": [
        { "value": "Transistor", "name": "Transistor <br> Not the tube kind." },
        { "value": "Tube", "name": "Tube <br> The tube kind." }
      ]
    },
    {
      "key": "radiobuttons",
      "style": { "selected": "btn-success", "unselected": "btn-default" },
      "type": "radiobuttons",
      "notitle": true
    },
    {
      "type": "actions",
      "items": [
        { "type": "submit", "style": "btn-info",   "title": "Do It!" },
        { "type": "button", "style": "btn-danger", "title": "Noooooooooooo", "onClick": "sayNo()" }
      ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/asf-simple.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Comment",
    "properties": {
      "name": {
        "title": "Name",
        "type": "string"
      },
      "email": {
        "title": "Email",
        "type": "string",
        "pattern": "^\\S+@\\S+$",
        "description": "Email will be used for evil."
      },
      "comment": {
        "title": "Comment",
        "type": "string",
        "maxLength": 20,
        "validationMessage": "Don't be greedy!"
      }
    },
    "required": [
      "name",
      "email",
      "comment"
    ]
  },
  "form": [
    "name",
    "email",
    {
      "key": "comment",
      "type": "textarea",
      "placeholder": "Make a comment"
    },
    {
      "type": "submit",
      "style": "btn-info",
      "title": "OK"
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/asf-tab-array.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Comment",
    "properties": {
      "comments": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "name": {
              "title": "Name",
              "type": "string"
            },
            "email": {
              "title": "Email",
              "type": "string",
              "pattern": "^\\S+@\\S+$",
              "description": "Email will be used for evil."
            },
            "comment": {
              "title": "Comment",
              "type": "string",
              "maxLength": 20,
              "validationMessage": "Don't be greedy!"
            }
          },
          "required": [ "name", "email", "comment" ]
        }
      }
    }
  },
  "form": [ {
    "type": "help",
    "helpvalue": "<h4>Tabbed Array Example</h4><p>Tab arrays can have tabs to the left, top or right.</p>"
  }, {
    "key": "comments",
    "type": "tabarray",
    "add": "New",
    "remove": "Delete",
    "style": { "remove": "btn-danger" },
    "title": "{{ value.name || 'Tab ' + $index }}",
    "items": [
      "comments[].name",
      "comments[].email",
      { "key": "comments[].comment", "type": "textarea" }
    ]
  }, {
    "type": "submit",
    "style": "btn-default",
    "title": "OK"
  } ]
}


================================================
FILE: demo/assets/example-schemas/asf-titlemap-examples.json
================================================
{
  "schema": {
    "type": "object",
    "properties": {
      "select": {
        "title": "Select without titleMap",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "select2": {
        "title": "Select with titleMap (old style)",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "noenum": {
        "type": "string",
        "title": "No enum, but forms says it's a select"
      },
      "array": {
        "title": "Array with enum defaults to 'checkboxes'",
        "type": "array",
        "items": {
          "type": "string",
          "enum": [ "a", "b", "c" ]
        }
      },
      "array2": {
        "title": "Array with titleMap",
        "type": "array",
        "default": [ "b", "c" ],
        "items": {
          "type": "string",
          "enum": [ "a", "b", "c" ]
        }
      },
      "radios": {
        "title": "Basic radio button example",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "radiobuttons": {
        "title": "Radio buttons used to switch a boolean",
        "type": "boolean",
        "default": false
      }
    }
  },
  "form": [
    "select",
    { "key": "select2",
      "type": "select",
      "titleMap": {
        "a": "A",
        "b": "B",
        "c": "C"
      }
    },
    { "key": "noenum",
      "type": "select",
      "titleMap": [
        { "value": "a", "name": "A" },
        { "value": "b", "name": "B" },
        { "value": "c", "name": "C" }
      ]
    },
    "array",
    { "key": "array2",
      "type": "checkboxes",
      "titleMap": [
        { "value": "a", "name": "A" },
        { "value": "b", "name": "B" },
        { "value": "c", "name": "C" }
      ]
    },
    { "key": "radios",
      "type": "radios",
      "titleMap": [
        { "value": "c", "name": "C" },
        { "value": "b", "name": "B" },
        { "value": "a", "name": "A" }
      ]
    },
    { "key": "radiobuttons",
      "type": "radiobuttons",
      "titleMap": [
        { "name": "No way", "value": false },
        { "name": "OK",     "value": true  }
      ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/jsf-events.json
================================================
{
  "schema": {
    "text": {
      "type": "string",
      "title": "Text"
    }
  },
  "form": [ {
    "key": "text",
    "onChange": function (evt) {
      var value = $(evt.target).val();
      if (value) alert(value);
    }
  }, {
    "type": "button",
    "title": "Click me",
    "onClick": function (evt) {
      evt.preventDefault();
      alert('Thank you!');
    }
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-factory-sleek.json
================================================
{
  "schema": {
    "color": {
      "title": "Color",
      "type": "string",
      "enum": [ "blue", "spicy", "gray", "earth", "vegetal" ],
      "default":"gray",
      "required": true
    },
    "backgroundimage" : {
      "title": "Background image for TV version",
      "type": "object"
    },
    "tabs": {
      "title": "Tabs titles",
      "type": "array",
      "items": {
        "title": "Short tab title (max. 15 characters)",
        "type": "string",
        "maxLength": 15
      }
    },
    "tabicons": {
      "title": "Tabs icons",
      "maxLength": 8,
      "type": "array",
      "items": {
        "title": "Tab icon",
        "type": "string",
        "enum": [ "contact", "event", "map", "news",
          "photo", "product", "sound", "status", "video" ]
      }
    }
  },
  "form": [ {
    "type": "fieldset",
    "legend": "Styles",
    "items": [
      "color",
      {
        "key" : "backgroundimage",
        "type": "file-hosted-public"
      }
    ]
  }, {
    "type": "fieldset",
    "legend": "Tabs",
    "items": [ {
      "type": "tabarray",
      "items": [ {
        "type": "section",
        "legend": "{{value}}",
        "items": [ {
          "key": "tabicons[]",
          "type": "imageselect",
          "imageWidth": 32,
          "imageHeight": 42,
          "imageButtonClass": "btn-inverse",
          "imagePrefix": "app/images/tv-",
          "imageSuffix": ".png",
          "imageSelectorTitle": "Based on tab data source"
        }, {
          "key": "tabs[]",
          "valueInLegend": true,
          "value": "{{values.datasources.main[]}}"
        } ]
      } ]
    } ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-ace.json
================================================
{
  "schema": {
    "code": {
      "type": "string",
      "title": "Some JSON"
    }
  },
  "form": [ {
    "key": "code",
    "type": "ace",
    "aceMode": "json",
    "aceTheme": "twilight",
    "width": "100%",
    "height": "200px"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-actions.json
================================================
{
  "schema": {
    "search": {
      "type": "string",
      "title": "Search"
    }
  },
  "form": [
    "search",
    {
      "type": "actions",
      "items": [ {
        "type": "submit",
        "title": "Submit"
      }, {
        "type": "button",
        "title": "Cancel"
      } ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-advancedfieldset.json
================================================
{
  "schema": {
    "name": {
      "type": "string",
      "title": "Name"
    },
    "age": {
      "type": "number",
      "title": "Age"
    }
  },
  "form": [
    "name",
    {
      "type": "advancedfieldset",
      "items": [
        "age"
      ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-array-simple.json
================================================
{
  "schema": {
    "friends": {
      "type": "array",
      "items": {
        "type": "object",
        "title": "Friend",
        "properties": {
          "nick": {
            "type": "string",
            "title": "Nickname"
          },
          "animals": {
            "type": "array",
            "items": {
              "type": "string",
              "title": "Animal name"
            }
          }
        }
      }
    }
  },
  "form": [ {
    "type": "array",
    "items": {
      "type": "section",
      "items": [
        "friends[].nick",
        {
          "type": "array",
          "items": [
            "friends[].animals[]"
          ]
        }
      ]
    }
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-array.json
================================================
{
  "schema": {
    "type": "object",
    "properties": {
      "friendsA": { "$ref": "#/definitions/friends" },
      "friendsB": { "$ref": "#/definitions/friends" }
    },
    "definitions": {
      "friends": {
        "type": "array",
        "items": {
          "type": "object",
          "title": "Friend",
          "properties": {
            "nick": {
              "type": "string",
              "title": "Nickname"
            },
            "animals": {
              "type": "array",
              "items": {
                "type": "string",
                "title": "Animal name"
              },
              "default": [ "dog", "cat" ]
            }
          }
        }
      }
    }
  },
  "customFormItems": {
    "friendsB": {
      "type": "array",
      "key": "friendsB",
      "title": "Friends B",
      "readOnly": true,
      "items": {
        "type": "section",
        "items": [
          {
            "type": "array",
            "key": "friendsB[].animals",
            "items": [
              "friendsB[].animals[]"
            ]
          },
          "friendsB[].nick"
        ]
      }
    }
  },
  "value": {
    "friendsB": [ {
      "nick": "B",
      "animals": [ "fish", "bee" ]
    }, {
      "nick": "B2",
      "animals": [ "bee", "cat" ]
    } ]
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-authfieldset.json
================================================
{
  "schema": {
    "name": {
      "type": "string",
      "title": "Name"
    },
    "key": {
      "type": "string",
      "title": "Access key"
    }
  },
  "form": [
    "name",
    {
      "type": "authfieldset",
      "items": [
        "key"
      ]
    }
  ]
}

================================================
FILE: demo/assets/example-schemas/jsf-fields-autocomplete.json
================================================
{
  "schema": {
    "name": {
      "title": "Name",
      "type": "string"
    },
    "nick": {
      "title": "Nick name",
      "type": "string"
    },
    "title": {
      "title": "Title",
      "type": "string"
    },
    "tags": {
      "title": "Tags",
      "type": "array",
      "items": { "type": "string" },
      "default": [ "abc", "def" ]
    }
  },
  "customFormItems": {
    "name": {
      "type": "text",
      "autocomplete": { "source": [ "abc", "bed", "bee", "dog", "cat" ] }
    },
    "nick": {
      "type": "text",
      "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] }
    },
    "title": {
      "type": "text",
      "tagsinput": { "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } }
    },
    "tags": {
      "type": "tagsinput",
      "tagsinput": { "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-checkbox.json
================================================
{
  "schema": {
    "properties": {
      "flag": {
        "type": "boolean",
        "title": "Adult"
      },
      "adultOnlyInfo": {
        "type": "object",
        "properties": {
          "field1": {
            "title": "Field 1",
            "type": "string"
          },
          "field2": {
            "title": "Field 2",
            "type": "integer"
          }
        },
        "required": [ "field1", "field2" ]
      },
      "commonInfo": {
        "title": "Common Field",
        "type": "string"
      }
    },
    "dependencies": {
      "flag": [ "adultOnlyInfo" ]
    }
  },
  "customFormItems": {
    "flag": {
      "inlinetitle": "Check this box if you are over 18",
      "toggleNext": 1
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-checkboxbuttons.json
================================================
{
  "schema": {
    "language": {
      "type": "array",
      "title": "Best language",
      "items": {
        "type": "string",
        "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ]
      }
    }
  },
  "form": [ {
    "key": "language",
    "type": "checkboxbuttons",
    "activeClass": "btn-success"
  }, {
    "title": "Submit",
    "type": "submit"
  } ],
  "value": {"language": "Python"}
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-checkboxes.json
================================================
{
  "schema": {
    "properties": {
      "menu": {
        "type": "array",
        "title": "Options",
        "items": {
          "type": "string",
          "title": "Option",
          "enum": [ "starter", "maincourse", "cheese", "dessert", "OTHER" ]
        },
        "minItems": 1
      },
      "menuOther": { "type": "string" },
      "menu2": {
        "type": "array",
        "title": "Options Inline",
        "items": {
          "type": "string",
          "title": "Option",
          "enum": [ "starter", "maincourse", "CUSTOME_OTHER_VALUE", "cheese", "dessert" ]
        }
      },
      "menu2Other": { "type": "string" },
      "menu3": {
        "type": "array",
        "title": "Options",
        "description": "Other field's value as an element of result array",
        "items": {
          "type": "string"
        },
        "minItems": 1
      }
    }
  },
  "nonDefaultFormItems": [ "menuOther", "menu2Other" ],
  "customFormItems": {
    "menu": {
      "type": "checkboxes",
      "titleMap": {
        "starter": "Starter would be great",
        "maincourse": "No way I'll skip the main course",
        "cheese": "Cheddar rules!",
        "dessert": "Thumbs up for a dessert"
      },
      "otherField": { "key": "menuOther", "inline": true }
    },
    "menu2": {
      "type": "checkboxes",
      "title": "Options inline style",
      "inline": true,
      "titleMap": {
        "starter": "Starter would be great",
        "maincourse": "No way I'll skip the main course",
        "cheese": "Cheddar rules!",
        "dessert": "Thumbs up for a dessert"
      },
      "otherField": {
        "key": "menu2Other",
        "title": "Custom other field title",
        "otherValue": "CUSTOME_OTHER_VALUE"
      }
    },
    "menu3": {
      "type": "checkboxes",
      "options": {
        "starter": "Starter would be great",
        "maincourse": "No way I'll skip the main course",
        "cheese": "Cheddar rules!",
        "dessert": "Thumbs up for a dessert"
      },
      "otherField": { "key": "menu3[99]", "type": "text", "asArrayValue": true }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-color.json
================================================
{
  "schema": {
    "maincolor": {
      "type": "string",
      "title": "Main color",
      "format": "color"
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-common.json
================================================
{
  "schema": {
    "shortmood": {
      "type": "string",
      "title": "Mood of the day",
      "description": "Describe how you feel in short",
      "default": "happy",
      "required": true
    },
    "longmood": {
      "type": "string",
      "title": "Mood of the day",
      "description": "Describe how you feel with a rather long adjective-like series of words"
    }
  },
  "form": [
    "shortmood",
    {
      "key": "longmood",
      "prepend": "I feel",
      "append": "today",
      "notitle": true,
      "htmlClass": "usermood",
      "fieldHtmlClass": "input-xxlarge",
      "placeholder": "incredibly and admirably great"
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-fieldset.json
================================================
{
  "schema": {
    "comment": {
      "type": "string",
      "title": "Comment"
    },
    "name": {
      "type": "string",
      "title": "Name"
    },
    "age": {
      "type": "number",
      "title": "Age"
    }
  },
  "form": [ {
    "key": "comment",
    "type": "textarea"
  }, {
    "type": "fieldset",
    "title": "Author",
    "expandable": true,
    "items": [
      "name",
      "age"
    ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-help.json
================================================
{
  "schema": {
    "name": {
      "title": "Name",
      "description": "Nickname allowed",
      "type": "string"
    },
    "gender": {
      "title": "Gender",
      "description": "Your gender",
      "type": "string",
      "enum": [
        "male",
        "female",
        "alien"
      ]
    }
  },
  "form": [
    "*",
    {
      "type": "help",
      "helpvalue": "<strong>Click on <em>Submit</em></strong> when you're done"
    },
    {
      "type": "submit",
      "title": "Submit"
    }
  ]
}

================================================
FILE: demo/assets/example-schemas/jsf-fields-hidden.json
================================================
{
  "schema": {
    "apikey": {
      "type": "string",
      "title": "API key",
      "default": "supercalifragilisticexpialidocious"
    },
    "text": {
      "type": "string",
      "title": "Search string"
    }
  },
  "form": [ {
    "key": "apikey",
    "type": "hidden"
  },
  "text",
  {
    "type": "submit",
    "title": "Search"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-iconselect.json
================================================
{
  "schema": {
    "icon": {
      "title": "Choose an icon",
      "type": "string",
      "enum": [ "glass", "music", "search", "envelope", "heart", "star",
        "star-empty", "user", "film", "th-large", "th", "th-list", "ok",
        "remove", "zoom-in", "zoom-out", "off", "signal", "cog", "trash",
        "home", "file", "time", "road", "download-alt", "download", "upload",
        "inbox", "play-circle", "repeat", "refresh", "list-alt", "lock", "flag",
        "headphones", "volume-off", "volume-down", "volume-up", "qrcode",
        "barcode", "tag", "tags", "book", "bookmark", "print", "camera", "font",
        "bold", "italic", "text-height", "text-width", "align-left",
        "align-center", "align-right", "align-justify", "list", "indent-left",
        "indent-right", "facetime-video", "picture", "pencil", "map-marker",
        "adjust", "tint", "edit", "share", "check", "move", "step-backward",
        "fast-backward", "backward", "play", "pause", "stop", "forward",
        "fast-forward", "step-forward", "eject", "chevron-left",
        "chevron-right", "plus-sign", "minus-sign", "remove-sign", "ok-sign",
        "question-sign", "info-sign", "screenshot", "remove-circle",
        "ok-circle", "ban-circle", "arrow-left", "arrow-right", "arrow-up",
        "arrow-down", "share-alt", "resize-full", "resize-small", "plus",
        "minus", "asterisk", "exclamation-sign", "gift", "leaf", "fire",
        "eye-open", "eye-close", "warning-sign", "plane", "calendar", "random",
        "comment", "magnet", "chevron-up", "chevron-down", "retweet",
        "shopping-cart", "folder-close", "folder-open", "resize-vertical",
        "resize-horizontal", "hdd", "bullhorn", "bell", "certificate",
        "thumbs-up", "thumbs-down", "hand-right", "hand-left", "hand-up",
        "hand-down", "circle-arrow-right", "circle-arrow-left",
        "circle-arrow-up", "circle-arrow-down", "globe", "wrench", "tasks",
        "filter", "briefcase", "fullscreen" ]
    }
  },
  "form": [ {
    "key": "icon",
    "type": "iconselect",
    "imageButtonClass": "btn",
    "imageSelectorColumns": 10,
    "imageSelectorTitle": "Select an icon"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-imageselect.json
================================================
{
  "schema": {
    "icon": {
      "title": "Choose an icon",
      "type": "string",
      "enum": [
        "address-book", "archive", "balloon",
        "calendar", "camera", "cd", "disk",
        "heart", "home", "mail"
      ]
    }
  },
  "form": [ {
    "key": "icon",
    "type": "imageselect",
    "imageWidth": 64,
    "imageHeight": 64,
    "imageButtonClass": "btn-inverse",
    "imagePrefix": "http://icons.iconarchive.com/icons/double-j-design/origami-colored-pencil/64/blue-",
    "imageSuffix": "-icon.png",
    "imageSelectorColumns": 4,
    "imageSelectorTitle": "Random choice"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-password.json
================================================
{
  "schema": {
    "pwd": {
      "type": "string",
      "title": "Your secret"
    }
  },
  "form": [ {
    "key": "pwd",
    "type": "password"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-questions.json
================================================
{
  "schema": {
    "response": {
      "type": "string",
      "title": "Search"
    }
  },
  "form": [ {
    "type": "questions",
    "key": "response",
    "title": "Let's check your mood",
    "items": [ {
      "type": "question",
      "title": "Are you happy?",
      "activeClass": "btn-success",
      "optionsType": "radiobuttons",
      "options": [ {
        "title": "Yes",
        "value": "happy",
        "next": "q2",
        "htmlClass": "btn-primary"
      }, {
        "title": "No",
        "value": "sad",
        "submit": true
      } ]
    }, {
      "type": "question",
      "qid": "q2",
      "title": "Really happy?",
      "options": [ {
        "title": "Yes",
        "value": "reallyhappy",
        "submit": true
      }, {
        "title": "No",
        "value": "happy",
        "submit": true
      } ]
    } ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-radiobuttons.json
================================================
{
  "schema": {
    "language": {
      "type": "string",
      "title": "Best language",
      "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ]
    },
    "favourite": {
      "type": "boolean",
      "title": "Is it your favourite?"
    }
  },
  "form": [ {
    "key": "language",
    "type": "radiobuttons",
    "activeClass": "btn-success"
  }, {
    "key": "favourite",
    "type": "radiobuttons",
    "activeClass": "btn-danger",
    "titleMap": {
      "true": "Yes",
      "false": "No"
    }
  }, {
    "title": "Submit",
    "type": "submit"
  } ],
  "value": { "language": "Python" }
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-radios.json
================================================
{
  "schema": {
    "language": {
      "type": "string",
      "title": "Best language",
      "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ]
    },
    "fantastic": {
      "type": "boolean",
      "title": "Is it fantastic?",
      "required": true
    },
    "cool": {
      "type": "boolean",
      "title": "Is it cool?"
    },
    "cool2": {
      "type": "boolean",
      "title": "Is it cool again?"
    }
  },
  "form": [ {
    "key": "language",
    "type": "radios"
  }, {
    "key": "fantastic",
    "type": "radios",
    "inline": true,
    "toggleNextMap": { "true": true }
  }, {
    "key": "cool",
    "type": "radios",
    "titleMap": {
      "false": "Not at all",
      "true": "Very cool"
    }
  }, {
    "key": "cool2",
    "type": "radios",
    "options": {
      "false": "Not at all",
      "true": "Very cool"
    }
  }, {
    "title": "Submit",
    "type": "submit"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-range.json
================================================
{
  "schema": {
    "range": {
      "type": "integer",
      "title": "Is JSON Form useful?",
      "description": "The field should appear as a range that accepts values between 0 (excluded) and 200 by steps of 20 on browsers that support the \"range\" input type.<br/>Note that the \"step\" constraint is not enforced when the form is submitted.",
      "default": 40,
      "minimum": 0,
      "exclusiveMinimum": true,
      "maximum": 200
    }
  },
  "form": [ {
    "key": "range",
    "type": "range",
    "step": 20
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-section.json
================================================
{
  "schema": {
    "comment": {
      "type": "string",
      "title": "Comment"
    },
    "name": {
      "type": "string",
      "title": "Name"
    },
    "age": {
      "type": "number",
      "title": "Age"
    }
  },
  "form": [ {
    "key": "comment",
    "type": "textarea"
  }, {
    "type": "section",
    "title": "Author",
    "items": [
      "name",
      "age"
    ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-select.json
================================================
{
  "schema": {
    "gender": {
      "type": "string",
      "title": "Gender",
      "enum": [ "male", "female", "alien" ]
    },
    "gender2": {
      "type": "string",
      "title": "Gender",
      "enum": [ "male", "female", "alien" ],
      "required": true
    },
    "ismale": {
      "type": "boolean",
      "title": "Is male?"
    },
    "isfemale": {
      "type": "boolean",
      "title": "Is female?"
    }
  },
  "form": [ {
    "key": "gender",
    "titleMap": {
      "male": "Dude",
      "female": "Dudette",
      "alien": "I'm from outer space!"
    }
  }, {
    "key": "gender2",
    "title": "Gender re-ordered",
    "options": {
      "": "Please select",
      "alien": "I'm from outer space!",
      "male": "Dude",
      "female": "Dudette"
    }
  }, {
    "key": "ismale",
    "type": "select",
    "required": true
  }, {
    "key": "isfemale",
    "type": "select",
    "titleMap": {
      "false": "No",
      "true": "Yes"
    }
  }, {
    "title": "Submit",
    "type": "submit"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-selectfieldset-key.json
================================================
{
  "schema": {
    "choice": {
      "type": "string",
      "enum": [ "text", "cat" ]
    },
    "text": {
      "type": "string",
      "title": "Text"
    },
    "category": {
      "type": "string",
      "title": "Category",
      "enum": [ "Geography", "Entertainment",
        "History", "Arts", "Science", "Sports" ]
    }
  },
  "form": [ {
    "type": "selectfieldset",
    "key": "choice",
    "title": "Make a choice",
    "titleMap": {
      "text": "Search by text",
      "cat": "Search by category"
    },
    "items": [ "text", "category" ]
  }, {
    "type": "submit",
    "value": "Submit"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-selectfieldset.json
================================================
{
  "schema": {
    "text": {
      "type": "string",
      "title": "Text"
    },
    "category": {
      "type": "string",
      "title": "Category",
      "enum": [ "Geography", "Entertainment",
        "History", "Arts", "Science", "Sports" ]
    }
  },
  "form": [ {
    "type": "selectfieldset",
    "title": "Make a choice",
    "items": [ {
      "key": "text",
      "legend": "Search by text"
    }, {
      "key": "category",
      "legend": "Search by category"
    } ]
  }, {
    "type": "submit",
    "title": "Submit"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-submit.json
================================================
{
  "schema": {
  	"name": {
      "title": "Name",
      "description": "Nickname allowed",
      "type": "string"
    },
    "gender": {
      "title": "Gender",
      "description": "Your gender",
      "type": "string",
      "enum": [ "male", "female", "alien" ]
    }
  },
  "form": [
    "*",
    {
      "type": "submit",
      "title": "OK Go - This Too Shall Pass"
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-tabarray-maxitems.json
================================================
{
  "schema": {
    "friends": {
      "type": "array",
      "maxItems": 3,
      "items": {
        "type": "object",
        "title": "Friend",
        "properties": {
          "nick": {
            "type": "string",
            "title": "Nickname"
          },
          "animals": {
            "type": "array",
            "maxItems": 2,
            "items": {
              "type": "string",
              "title": "Animal name"
            }
          }
        }
      }
    }
  },
  "form": [ {
    "type": "tabarray",
    "items": {
      "type": "section",
      "items": [
        "friends[].nick",
        {
          "type": "array",
          "items": [
            "friends[].animals[]"
          ]
        }
      ]
    }
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-tabarray-value.json
================================================
{
  "schema": {
    "thoughts": {
      "type": "array",
      "items": {
        "type": "string",
        "title": "Thought",
        "default": "wtf"
      }
    }
  },
  "form": [ {
    "type": "tabarray",
    "items": [ {
      "type": "section",
      "legend": "{{idx}}. {{value}}",
      "items": [ {
        "key": "thoughts[]",
        "valueInLegend": true
      } ]
    } ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-tabarray.json
================================================
{
  "schema": {
  	"friends": {
      "type": "array",
      "items": {
        "type": "object",
        "title": "Friend",
        "properties": {
          "nick": {
            "type": "string",
            "title": "Nickname"
          },
          "animals": {
            "type": "array",
            "items": {
              "type": "string",
              "title": "Animal name"
            }
          }
        }
      }
    }
  },
  "form": [ {
    "type": "tabarray",
    "items": {
      "type": "section",
      "items": [
        "friends[].nick",
        {
          "type": "array",
          "items": [
            "friends[].animals[]"
          ]
        }
      ]
    }
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-fields-textarea.json
================================================
{
  "schema": {
    "comment": {
      "type": "string",
      "title": "Your thoughts"
    }
  },
  "form": [ {
    "key": "comment",
    "type": "textarea"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-gettingstarted.json
================================================
{
  "schema": {
    "field": {
      "type": "string",
      "title": "A field"
    }
  },
  "form": [ {
    "key": "field"
  }, {
    "type": "submit",
    "title": "Submit"
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-previousvalues-multidimensional.json
================================================
{
  "schema": {
    "reminders": {
      "type": "array",
      "title": "Reminders",
      "items": {
        "type": "array",
        "title": "Task List",
        "items": {
          "type": "string"
        }
      }
    }
  },
  "value": {
    "reminders": [
      [ "Buy clothes", "Pick up kids" ],
      [ "Call John", "Send email" ],
      [ "Wash car" ]
    ]
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-previousvalues.json
================================================
{
  "schema": {
    "friends": {
      "type": "array",
      "items": {
        "type": "object",
        "title": "Friend",
        "properties": {
          "nick": {
            "type": "string",
            "title": "Nickname",
            "required": true
          },
          "gender": {
            "type": "string",
            "title": "Gender",
            "enum": [ "male", "female", "alien" ]
          },
          "age": {
            "type": "integer",
            "title": "Age"
          }
        }
      }
    }
  },
  "value": {
    "friends": [
      { "nick": "tidoust", "gender": "male",   "age": 34 },
      { "nick": "titine",  "gender": "female", "age": 6 },
      { "nick": "E.T.",    "gender": "alien" }
    ]
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-array.json
================================================
{
  "schema": {
    "friends": {
      "type": "array",
      "items": {
        "type": "object",
        "title": "Friend",
        "properties": {
          "nick": {
            "type": "string",
            "title": "Nickname",
            "required": true
          },
          "gender": {
            "type": "string",
            "title": "Gender",
            "enum": [ "male", "female", "alien" ]
          },
          "age": {
            "type": "integer",
            "title": "Age"
          }
        }
      }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-basic.json
================================================
{
  "schema": {
    "name": {
      "title": "Name",
      "description": "Nickname allowed",
      "type": "string"
    },
    "gender": {
      "title": "Gender",
      "description": "Your gender",
      "type": "string",
      "enum": [ "male", "female", "alien" ]
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-default.json
================================================
{
  "schema": {
    "friends": {
      "type": "array",
      "default": [ "foo", "bar" ],
      "readOnly": true,
      "items": {
        "type": "string",
        "title": "Name",
        "readOnly": true
      }
    },
    "fiends": {
      "type": "array",
      "default": [
        { "name": "bob", "age": 24 },
        { "name": "alice", "age": 42 }
      ],
      "readOnly": true,
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "named"
          },
          "age": {
            "type": "integer",
            "title": "Age",
            "default": 29
          },
          "address": {
            "title": "Address",
            "type": "object",
            "properties": {
              "street": { "type": "string" },
              "zip": { "type": "string" },
              "city": { "type": "string" }
            },
            "default": { "zip": "N/A" }
          }
        },
        "default": { "name": "ah", "age": 55 }
      }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-inlineref.json
================================================
{
  "schema": {
    "properties": {
      "animal": { "$ref": "#/definitions/animation" }
    },
    "definitions": {
      "animation": {
        "type": "object",
        "properties": {
          "duration": {
            "title": "Duration",
            "type": "integer"
          },
          "stepper": {
            "title": "Stepper",
            "type": "string"
          },
          "then": {
            "title": "Then",
            "type": "array",
            "maxItems": 1,
            "items": { "$ref": "#/definitions/animation" },
            "default": []
          }
        }
      }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-morecomplex.json
================================================
{
  "schema": {
    "message": {
      "type": "string",
      "title": "Message"
    },
    "author": {
      "type": "object",
      "title": "Author",
      "properties": {
        "name": {
          "type": "string",
          "title": "Name"
        },
        "gender": {
          "type": "string",
          "title": "Gender",
          "enum": [ "male", "female", "alien" ]
        },
        "magic": {
          "type": "integer",
          "title": "Magic number",
          "default": 42
        }
      }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-schema-required.json
================================================
{
  "schema": {
    "v3customer": {
      "title": "Customer",
      "description": "json-schema v3 style 'required'",
      "type": "object",
      "required": true,
      "properties": {
        "name": {
          "required": true,
          "title": "Name",
          "type": "string"
        },
        "address": {
          "title": "Address",
          "type": "object",
          "properties": {
            "city": {
              "required": true,
              "title": "City",
              "type": "string"
            },
            "street": {
              "required": true,
              "title": "Street",
              "type": "string"
            },
            "zip": {
              "title": "Zip",
              "type": "string"
            }
          }
        }
      }
    },
    "v4customer": {
      "title": "CustomerV4",
      "description": "json-schema v4 style 'required'",
      "type": "object",
      "properties": {
        "name": {
          "title": "Name",
          "type": "string"
        },
        "address": {
          "title": "Address",
          "type": "object",
          "properties": {
            "city": {
              "title": "City",
              "type": "string"
            },
            "street": {
              "title": "Street",
              "type": "string"
            },
            "zip": {
              "title": "Zip",
              "type": "string"
            }
          },
          "required": [ "street", "city" ]
        }
      },
      "required": [ "name" ]
    }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-templating-idx.json
================================================
{
  "schema": {
    "thoughts": {
      "type": "array",
      "items": {
        "title": "A thought",
        "type": "string"
      }
    }
  },
  "form": [ {
    "type": "array",
    "items": [ {
      "key": "thoughts[]",
      "title": "Thought number {{idx}}"
    } ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-templating-tpldata.json
================================================
{
  "schema": {
    "age": {
      "type": "integer",
      "title": "Age"
    }
  },
  "form": [ {
    "key": "age",
    "title": "{{user.name}}'s age"
  } ],
  "tpldata": {
    "user": { "name": "tidoust" }
  }
}


================================================
FILE: demo/assets/example-schemas/jsf-templating-value.json
================================================
{
  "schema": {
    "thoughts": {
      "type": "array",
      "title": "Thoughts",
      "items": {
        "type": "string",
        "title": "A thought",
        "default": "Grmpf"
      }
    }
  },
  "form": [ {
    "type": "tabarray",
    "items": [ {
      "type": "section",
      "legend": "{{idx}}. {{value}}",
      "items": [ {
        "key": "thoughts[]",
        "title": "Thought {{idx}}",
        "valueInLegend": true
      } ]
    } ]
  } ]
}


================================================
FILE: demo/assets/example-schemas/jsf-templating-values.json
================================================
{
  "schema": {
    "firstname": { "type": "string", "title": "First name" },
    "lastname":  { "type": "string", "title": "Last name" },
    "fullname":  { "type": "string", "title": "Full name" }
  },
  "form": [
    "firstname",
    "lastname",
    {
      "key": "fullname",
      "value": "{{values.firstname}} {{values.lastname}}"
    }
  ],
  "value": {
    "firstname": "François",
    "lastname": "Daoust"
  }
}


================================================
FILE: demo/assets/example-schemas/json-schema-draft01.json
================================================
{
	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
	"id" : "http://json-schema.org/draft-01/schema#",
	"type" : "object",
  "properties" : {
		"type" : {
			"type" : [ "string", "array" ],
			"items" : { "type" : [ "string", { "$ref" : "#" } ] },
			"optional" : true,
			"default" : "any"
		},
		"properties" : {
			"type" : "object",
			"additionalProperties" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		},
		"items" : {
			"type" : [ { "$ref" : "#" }, "array" ],
			"items" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		},
		"optional" : { "type" : "boolean", "optional" : true, "default" : false },
		"additionalProperties" : {
			"type" : [ { "$ref" : "#" }, "boolean" ],
			"optional" : true,
			"default" : {}
		},
		"requires" : { "type" : [ "string", { "$ref" : "#" } ], "optional" : true },
		"minimum" : { "type" : "number", "optional" : true },
		"maximum" : { "type" : "number", "optional" : true },
		"minimumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "minimum",
			"default" : true
		},
		"maximumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "maximum",
			"default" : true
		},
		"minItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		"maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 },
		"pattern" : { "type" : "string", "optional" : true, "format" : "regex" },
		"minLength" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		"maxLength" : { "type" : "integer", "optional" : true },
		"enum" : { "type" : "array", "optional" : true, "minItems" : 1 },
		"title" : { "type" : "string", "optional" : true },
		"description" : { "type" : "string", "optional" : true },
		"format" : { "type" : "string", "optional" : true },
		"contentEncoding" : { "type" : "string", "optional" : true },
		"default" : { "type" : "any", "optional" : true },
		"maxDecimal" : { "type" : "integer", "optional" : true, "minimum" : 0 },
		"disallow" : {
			"type" : [ "string", "array" ],
			"items" : { "type" : "string" },
			"optional" : true
		},
		"extends" : {
			"type" : [ { "$ref" : "#" }, "array" ],
			"items" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		}
	},
  "optional" : true,
	"default" : {}
}


================================================
FILE: demo/assets/example-schemas/json-schema-draft02.json
================================================
{
	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
	"id" : "http://json-schema.org/draft-02/schema#",
	"type" : "object",
	"properties" : {
		"type" : {
			"type" : [ "string", "array" ],
			"items" : { "type" : [ "string", { "$ref" : "#" } ] },
			"optional" : true,
			"uniqueItems" : true,
			"default" : "any"
		},
		"properties" : {
			"type" : "object",
			"additionalProperties" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		},
		"items" : {
			"type" : [ { "$ref" : "#" }, "array" ],
			"items" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		},
		"optional" : { "type" : "boolean", "optional" : true, "default" : false },
		"additionalProperties" : {
			"type" : [ { "$ref" : "#" }, "boolean" ],
			"optional" : true,
			"default" : {}
		},
		"requires" : { "type" : [ "string", { "$ref" : "#" } ], "optional" : true },
		"minimum" : { "type" : "number", "optional" : true },
		"maximum" : { "type" : "number", "optional" : true },
		"minimumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "minimum",
			"default" : true
		},
		"maximumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "maximum",
			"default" : true
		},
		"minItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		"maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 },
		"uniqueItems" : { "type" : "boolean", "optional" : true, "default" : false },
		"pattern" : { "type" : "string", "optional" : true, "format" : "regex" },
		"minLength" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		"maxLength" : { "type" : "integer", "optional" : true },
		"enum" : {
			"type" : "array",
			"optional" : true,
			"minItems" : 1,
			"uniqueItems" : true
		},
		"title" : { "type" : "string", "optional" : true },
		"description" : { "type" : "string", "optional" : true },
		"format" : { "type" : "string", "optional" : true },
		"contentEncoding" : { "type" : "string", "optional" : true },
		"default" : { "type" : "any", "optional" : true },
		"divisibleBy" : {
			"type" : "number",
			"minimum" : 0,
			"minimumCanEqual" : false,
			"optional" : true,
			"default" : 1
		},
		"disallow" : {
			"type" : [ "string", "array" ],
			"items" : { "type" : "string" },
			"optional" : true,
			"uniqueItems" : true
		},
		"extends" : {
			"type" : [ { "$ref" : "#" }, "array" ],
			"items" : { "$ref" : "#" },
			"optional" : true,
			"default" : {}
		}
	},
	"optional" : true,
	"default" : {}
}


================================================
FILE: demo/assets/example-schemas/json-schema-draft03.json
================================================
{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "id": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": [ "string", "array" ],
      "items": { "type": [ "string", { "$ref": "#" } ] },
      "uniqueItems": true,
      "default": "any"
    },
    "properties": {
      "type": "object",
      "additionalProperties": { "$ref": "#" },
      "default": { }
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": { "$ref": "#" },
      "default": { }
    },
    "additionalProperties": {
      "type": [ { "$ref": "#" }, "boolean" ],
      "default": { }
    },
    "items": {
      "type": [ { "$ref": "#" }, "array" ],
      "items": { "$ref": "#" },
      "default": { }
    },
    "additionalItems": {
      "type": [ { "$ref": "#" }, "boolean" ],
      "default": { }
    },
    "required": { "type": "boolean", "default": false },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "type": [ "string", "array", { "$ref": "#" } ],
        "items": { "type": "string" }
      },
      "default": { }
    },
    "minimum": { "type": "number" },
    "maximum": { "type": "number" },
    "exclusiveMinimum": { "type": "boolean", "default": false },
    "exclusiveMaximum": { "type": "boolean", "default": false },
    "minItems": { "type": "integer", "minimum": 0, "default": 0 },
    "maxItems": { "type": "integer", "minimum": 0 },
    "uniqueItems": { "type": "boolean", "default": false },
    "pattern": { "type": "string", "format": "regex" },
    "minLength": { "type": "integer", "minimum": 0, "default": 0 },
    "maxLength": { "type": "integer" },
    "enum": { "type": "array", "minItems": 1, "uniqueItems": true },
    "default": { "type": "any" },
    "title": { "type": "string" },
    "description": { "type": "string" },
    "format": { "type": "string" },
    "divisibleBy": {
      "type": "number",
      "minimum": 0,
      "exclusiveMinimum": true,
      "default": 1
    },
    "disallow": {
      "type": [ "string", "array" ],
      "items": { "type": [ "string", { "$ref": "#" } ] },
      "uniqueItems": true
    },
    "extends": {
      "type": [ { "$ref": "#" }, "array" ],
      "items": { "$ref": "#" },
      "default": { }
    },
    "id": { "type": "string", "format": "uri" },
    "$ref": { "type": "string", "format": "uri" },
    "$schema": { "type": "string", "format": "uri" }
  },
  "dependencies": {
    "exclusiveMinimum": "minimum",
    "exclusiveMaximum": "maximum"
  },
  "default": { }
}


================================================
FILE: demo/assets/example-schemas/json-schema-draft04.json
================================================
{
  "id": "http://json-schema.org/draft-04/schema#",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Core schema meta-schema",
  "definitions": {
    "schemaArray": { "type": "array", "minItems": 1, "items": { "$ref": "#" } },
    "positiveInteger": { "type": "integer", "minimum": 0 },
    "positiveIntegerDefault0": {
      "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
    },
    "simpleTypes": { "enum": [
      "array", "boolean", "integer", "null", "number", "object", "string"
    ] },
    "stringArray": {
      "type": "array",
      "items": { "type": "string" },
      "minItems": 1,
      "uniqueItems": true
    }
  },
  "type": "object",
  "properties": {
    "id": { "type": "string", "format": "uri" },
    "$schema": { "type": "string", "format": "uri" },
    "title": { "type": "string" },
    "description": { "type": "string" },
    "default": { },
    "multipleOf": { "type": "number", "minimum": 0, "exclusiveMinimum": true },
    "maximum": { "type": "number" },
    "exclusiveMaximum": { "type": "boolean", "default": false },
    "minimum": { "type": "number" },
    "exclusiveMinimum": { "type": "boolean", "default": false },
    "maxLength": { "$ref": "#/definitions/positiveInteger" },
    "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
    "pattern": { "type": "string", "format": "regex" },
    "additionalItems": {
      "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": { }
    },
    "items": {
      "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ],
      "default": { }
    },
    "maxItems": { "$ref": "#/definitions/positiveInteger" },
    "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
    "uniqueItems": { "type": "boolean", "default": false },
    "maxProperties": { "$ref": "#/definitions/positiveInteger" },
    "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
    "required": { "$ref": "#/definitions/stringArray" },
    "additionalProperties": {
      "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": { }
    },
    "definitions": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": { }
    },
    "properties": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": { }
    },
    "patternProperties": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": { }
    },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/stringArray" } ]
      }
    },
    "enum": { "type": "array", "minItems": 1, "uniqueItems": true },
    "type": {
      "anyOf": [ {
        "$ref": "#/definitions/simpleTypes"
      }, {
        "type": "array",
        "items": { "$ref": "#/definitions/simpleTypes" },
        "minItems": 1,
        "uniqueItems": true
      } ]
    },
    "allOf": { "$ref": "#/definitions/schemaArray" },
    "anyOf": { "$ref": "#/definitions/schemaArray" },
    "oneOf": { "$ref": "#/definitions/schemaArray" },
    "not": { "$ref": "#" }
  },
  "dependencies": {
    "exclusiveMaximum": [ "maximum" ],
    "exclusiveMinimum": [ "minimum" ]
  },
  "default": { }
}


================================================
FILE: demo/assets/example-schemas/json-schema-draft06.json
================================================
{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "$id": "http://json-schema.org/draft-06/schema#",
  "title": "Core schema meta-schema",
  "definitions": {
    "schemaArray": { "type": "array", "minItems": 1, "items": { "$ref": "#" } },
    "nonNegativeInteger": { "type": "integer", "minimum": 0 },
    "nonNegativeIntegerDefault0": { "allOf": [
      { "$ref": "#/definitions/nonNegativeInteger" }, { "default": 0 }
    ] },
    "simpleTypes": { "enum": [
      "array", "boolean", "integer", "null", "number", "object", "string"
    ] },
    "stringArray": {
      "type": "array", "items": { "type": "string" }, "uniqueItems": true, "default": []
    }
  },
  "type": [ "object", "boolean" ],
  "properties": {
    "$id": { "type": "string", "format": "uri-reference" },
    "$schema": { "type": "string", "format": "uri" },
    "$ref": { "type": "string", "format": "uri-reference" },
    "title": { "type": "string" },
    "description": { "type": "string" },
    "default": {},
    "multipleOf": { "type": "number", "exclusiveMinimum": 0 },
    "maximum": { "type": "number" },
    "exclusiveMaximum": { "type": "number" },
    "minimum": { "type": "number" },
    "exclusiveMinimum": { "type": "number" },
    "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
    "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
    "pattern": { "type": "string", "format": "regex" },
    "additionalItems": { "$ref": "#" },
    "items": {
      "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ],
      "default": {}
    },
    "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
    "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
    "uniqueItems": { "type": "boolean", "default": false },
    "contains": { "$ref": "#" },
    "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
    "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
    "required": { "$ref": "#/definitions/stringArray" },
    "additionalProperties": { "$ref": "#" },
    "definitions": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": {}
    },
    "properties": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": {}
    },
    "patternProperties": {
      "type": "object", "additionalProperties": { "$ref": "#" }, "default": {}
    },
    "dependencies": { "type": "object", "additionalProperties": {
      "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/stringArray" } ]
    } },
    "propertyNames": { "$ref": "#" },
    "const": {},
    "enum": { "type": "array", "minItems": 1, "uniqueItems": true },
    "type": { "anyOf": [
      { "$ref": "#/definitions/simpleTypes" },
      { "type": "array",
        "items": { "$ref": "#/definitions/simpleTypes" },
        "minItems": 1,
        "uniqueItems": true
      }
    ] },
    "format": { "type": "string" },
    "allOf": { "$ref": "#/definitions/schemaArray" },
    "anyOf": { "$ref": "#/definitions/schemaArray" },
    "oneOf": { "$ref": "#/definitions/schemaArray" },
    "not": { "$ref": "#" }
  },
  "default": {}
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-data-only.json
================================================
{
  "data": {
    "first_name": "Jane",
    "last_name": "Doe",
    "age": 25,
    "is_company": false,
    "address": {
      "street_1": "123 Main St.",
      "street_2": null,
      "city": "Las Vegas",
      "state": "NV",
      "zip_code": "89123"
    },
    "phone_numbers": [
      { "number": "702-123-4567", "type": "cell" },
      { "number": "702-987-6543", "type": "work" }
    ],
    "notes": ""
  }
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-deep-ref.json
================================================
{
  "schema": {
    "definitions": {
      "int": {
        "type": "number",
        "minimum": 0,
        "maximum": 10
      },
      "string": {
        "type": "string",
        "minLength": 0
      },
      "valueItem": {
        "type": "object",
        "properties": { "value": { "$ref": "#/definitions/int" } }
      },
      "valueItemArray": {
        "type": "array",
        "items": { "$ref": "#/definitions/valueItemArray" }
      },
      "dtoArray": {
        "type": "array",
        "items": { "$ref": "#/definitions/staffLanguageLevelDto" }
      },
      "staffLanguageLevelDto": {
        "type": "object",
        "properties": {
          "id": { "$ref": "#/definitions/int" },
          "staffId": { "allOf" : [
            { "$ref": "#/definitions/int" },
            { "maximum": 5,
              "title": "staffId (overriden maximum)" }
          ] },
          "languageId": { "allOf" : [
            { "$ref": "#/definitions/valueItem" },
            { "title": "languageId (object with custom title)" }
          ] },
          "languageLevelId": { "$ref": "#/definitions/int" },
          "languageName2": { "allOf" : [
            { "$ref": "#/definitions/string" },
            { "default": "ole",
              "maxLength": 3,
              "title": "languageName2 (custom default & maxLength)" }
          ] },
          "languageLevelName": { "$ref": "#/definitions/dtoArray" }
        }
      }
    },
    "properties": {
      "staffLanguageLevelDto": { "$ref": "#/definitions/staffLanguageLevelDto" }
    }
  }
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-flex-layout.json
================================================
{
  "schema": {
    "type": "object",
    "properties": {
      "first_name": { "type": "string" },
      "last_name": { "type": "string" },
      "address": {
        "type": "object",
        "properties": {
          "street_1": { "type": "string" },
          "street_2": { "type": "string" },
          "city": { "type": "string" },
          "state": {
            "type": "string",
            "enum": [ "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE",
                "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA",
                "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS",
                "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND",
                "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD",
                "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV", "WI", "WY" ]
          },
          "zip_code": { "type": "string" }
        }
      },
      "birthday": { "type": "string" },
      "notes": { "type": "string" },
      "phone_numbers": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "type": { "type": "string", "enum": [ "cell", "home", "work" ] },
            "number": { "type": "string" }
          },
          "required": [ "type", "number" ]
        }
      }
    },
    "required": [ "last_name" ]
  },
  "layout": [
    { "type": "flex", "flex-flow": "row wrap", "items": [ "first_name", "last_name" ] },
    { "key": "address.street_1", "title": "Address", "placeholder": "Street" },
    { "key": "address.street_2", "notitle": true },
    { "type": "div",
      "display": "flex",
      "flex-direction": "row",
      "items": [
        { "key": "address.city", "flex": "3 3 150px",
          "notitle": true, "placeholder": "City"
        },
        { "key": "address.state", "flex": "1 1 50px",
          "notitle": true, "placeholder": "State"
        },
        { "key": "address.zip_code", "flex": "2 2 100px",
          "notitle": true, "placeholder": "Zip Code"
        }
      ]
    },
    { "key": "birthday", "type": "date" },
    { "key": "phone_numbers",
      "type": "array",
      "listItems": 3,
      "items": [ {
        "type": "div",
        "displayFlex": true,
        "flex-direction": "row",
        "items": [
          { "key": "phone_numbers[].type", "flex": "1 1 50px",
            "notitle": true, "placeholder": "Type"
          },
          { "key": "phone_numbers[].number", "flex": "4 4 200px",
            "notitle": true, "placeholder": "Phone Number"
          }
        ]
      } ]
    },
    { "type": "section",
      "title": "Notes",
      "expandable": true,
      "expanded": false,
      "items": [ { "key": "notes", "type": "textarea", "notitle": true } ]
    }
  ],
  "data": {
    "first_name": "Jane",
    "last_name": "Doe",
    "address": {
      "street_1": "123 Main St.",
      "city": "Las Vegas",
      "state": "NV",
      "zip_code": "89123"
    },
    "birthday": "1999-09-21",
    "phone_numbers": [
      { "type": "cell", "number": "702-123-4567" },
      { "type": "work", "number": "702-987-6543" }
    ],
    "notes": "(This is an example of an uninteresting note.)"
  }
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-layout-only.json
================================================
{
  "layout": [
    { "type": "section", "title": "Name", "required": true,
      "items": [
        "first_name",
        "last_name"
      ]
    },
    { "key": "age", "type": "integer" },
    { "key": "is_company", "title": "Is this a company?", "type": "checkbox" },
    { "key": "address.street_1", "title": "Address" },
    { "key": "address.street_2", "notitle": true },
    "address.city",
    "address.state",
    "address.zip_code",
    { "key": "phone_numbers", "type": "array",
      "items": [
        "phone_numbers[].number",
        "phone_numbers[].type"
      ]
    },
    { "key": "notes", "type": "textarea" },
    { "type": "submit" }
  ]
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-nested-arrays.json
================================================
{
  "schema": {
    "definitions": {
      "tiers_obj": {
        "type": "object",
        "title": "Tier",
        "properties": {
          "min_amount": { "type": "integer" },
          "max_amount": { "type": "integer" },
          "fees": {
            "title": "Fees (optional—max 2)",
            "type": "array",
            "maxItems": 2,
            "items": { "$ref": "#/definitions/fees_obj" }
          }
        }
      },
      "fees_obj": {
        "type": "object",
        "title": "Fee",
        "properties": {
          "ongoing_fee": { "type": "integer", "title": "Ongoing" },
          "application_fee": { "type": "integer", "title": "Application" }
        }
      }
    },
    "type": "object",
    "properties": {
      "tiers": {
        "title": "Tiers (required—max 3)",
        "type": "array",
        "maxItems": 3,
        "items": { "$ref": "#/definitions/tiers_obj", "extendRefs": true }
      }
    },
    "required": [ "tiers" ]
  }
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-select-list-examples.json
================================================
{
  "schema": {
    "title": "Who's your favorite captain?",
    "description": "Demonstrates different ways to create select controls from a list of values.",
    "type": "object",
    "properties": {
      "captain1": {
        "title": "Favorite captain 1",
        "description": "enum array in schema (JSON Schema v1+)",
        "type": "string",
        "enum": [ "William Shatner",
                  "Patrick Stewart",
                  "John Barrowman",
                  "Nathan Fillion" ]
      },
      "captain2": {
        "title": "Favorite captain 2",
        "description": "oneOf array with enum items in schema (JSON Schema v4+)",
        "type": "string",
        "oneOf":  [
          { "title": "James T. Kirk",    "enum": [ "William Shatner" ] },
          { "title": "Jean-Luc Picard",  "enum": [ "Patrick Stewart" ] },
          { "title": "Jack Harkness",    "enum": [ "John Barrowman"  ] },
          { "title": "Malcolm Reynolds", "enum": [ "Nathan Fillion"  ] }
        ]
      },
      "captain3": {
        "title": "Favorite captain 3",
        "description": "oneOf array with const items in schema (JSON Schema v6+)",
        "type": "string",
        "oneOf":  [
          { "title": "James T. Kirk",    "const": "William Shatner" },
          { "title": "Jean-Luc Picard",  "const": "Patrick Stewart" },
          { "title": "Jack Harkness",    "const": "John Barrowman"  },
          { "title": "Malcolm Reynolds", "const": "Nathan Fillion"  }
        ]
      },
      "captain4": {
        "title": "Favorite captain 4",
        "description": "titleMap array in layout (<a href=\"http://schemaform.io/examples/bootstrap-example.html#/65b7b86938bddeb30b149d47bd595f56\">Angular Schema Form</a>)",
        "type": "string"
      },
      "captain5": {
        "title": "Favorite captain 5",
        "description": "enum + enumNames in schema (<a href=\"https://mozilla-services.github.io/react-jsonschema-form/\">React jsonschema form</a>)",
        "type": "string",
        "enum":       [ "William Shatner",
                        "Patrick Stewart",
                        "John Barrowman",
                        "Nathan Fillion" ],
        "enumNames":  [ "James T. Kirk",
                        "Jean-Luc Picard",
                        "Jack Harkness",
                        "Malcolm Reynolds" ]
      },
      "captain6": {
        "title": "Favorite captain 6",
        "description": "titleMap object in layout (<a href=\"http://ulion.github.io/jsonform/playground/?example=fields-select\">JSON Form</a>)",
        "type": "string"
      },
      "captain7": {
        "title": "Favorite captain 7",
        "description": "flat titleMap array with groups in layout",
        "type": "string"
      },
      "captain8": {
        "title": "Favorite captain 8",
        "description": "hierarchical titleMap array in layout",
        "type": "string"
      },
      "captain9": {
        "title": "Favorite captain 9",
        "description": "oneOf array with <strong>title: \"group: name\"</strong> in schema",
        "type": "string",
        "oneOf": [
          { "title": "Star Trek: James T. Kirk",   "const": "William Shatner" },
          { "title": "Star Trek: Jean-Luc Picard", "const": "Patrick Stewart" },
          { "title": "Torchwood: Jack Harkness",   "const": "John Barrowman"  },
          { "title": "Firefly: Malcolm Reynolds",  "const": "Nathan Fillion"  }
        ]
      }
    }
  },
  "layout": [
    { "widget": "message", "message": "<h3>Values only</h3>" },
    "captain1",
    { "widget": "message", "message": "<h3>Names &amp; Values</h3>" },
    "captain2",
    "captain3",
    { "key": "captain4",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    "captain5",
    { "key": "captain6",
      "titleMap": {
        "William Shatner": "James T. Kirk",
        "Patrick Stewart": "Jean-Luc Picard",
        "John Barrowman" : "Jack Harkness",
        "Nathan Fillion" : "Malcolm Reynolds"
      }
    },
    { "widget": "message", "message": "<h3>Groups, Names, &amp; Values</h3>" },
    { "key": "captain7",
      "titleMap": [
        { "group": "Star Trek", "name": "James T. Kirk",    "value": "William Shatner" },
        { "group": "Star Trek", "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "group": "Torchwood", "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "group": "Firefly",   "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    { "key": "captain8",
      "titleMap": [
        { "group": "Star Trek",
          "items": [ { "name": "James T. Kirk",    "value": "William Shatner" },
                     { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" } ]
        },
        { "group": "Torchwood",
          "items": [ { "name": "Jack Harkness",    "value": "John Barrowman"  } ]
        },
        { "group": "Firefly",
          "items": [ { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  } ]
        }
      ]
    },
    "captain9"
  ]
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-select-widget-examples.json
================================================
{
  "schema": {
    "title": "Select your favorite captain",
    "type": "object",
    "properties": {
      "select1": {
        "title": "String + enum or titleMap defaults to select",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "select2": {
        "title": "String + titleMap defaults to select",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "select3": {
        "title": "String + enum + titleMap array",
        "type": "string"
      },
      "select4": {
        "title": "",
        "type": "string"
      },
      "select5": {
        "title": "",
        "type": "string"
      },
      "select6": {
        "title": "",
        "type": "string"
      },
      "array1": {
        "title": "Array + enum or titleMap defaults to checkboxes",
        "type": "array",
        "items": {
          "type": "string",
          "enum": [ "a", "b", "c" ]
        }
      },
      "array2": {
        "title": "Array + enum + maxItems = 1",
        "type": "array",
        "default": [ "b", "c" ],
        "items": {
          "type": "string",
          "enum": [ "a", "b", "c" ]
        }
      },
      "radios1": {
        "title": "widget = inline-radios",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "radios2": {
        "title": "widget = radios",
        "type": "string",
        "enum": [ "a", "b", "c" ]
      },
      "radiobuttons1": {
        "title": "widget = radiobuttons",
        "type": "boolean",
        "default": false
      },
      "radiobuttons2": {
        "title": "widget = radiobuttons, vertical = true",
        "type": "boolean",
        "default": false
      }
    }
  },
  "layout": [
    "select1",
    { "key": "select2",
      "titleMap": {
        "William Shatner": "James T. Kirk",
        "Patrick Stewart": "Jean-Luc Picard",
        "John Barrowman": "Jack Harkness",
        "Nathan Fillion": "Malcolm Reynolds"
      }
    },
    { "key": "select3",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    "select4",
    "select5",
    "select6",
    "array1",
    { "key": "array2",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    { "key": "radios1",
      "widget": "radios",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    { "key": "radios2",
      "widget": "inline-radios",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    { "key": "radiobuttons1",
      "widget": "radiobuttons",
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    },
    { "key": "radiobuttons2",
      "widget": "radiobuttons",
      "vertical": true,
      "titleMap": [
        { "name": "James T. Kirk",    "value": "William Shatner" },
        { "name": "Jean-Luc Picard",  "value": "Patrick Stewart" },
        { "name": "Jack Harkness",    "value": "John Barrowman"  },
        { "name": "Malcolm Reynolds", "value": "Nathan Fillion"  }
      ]
    }
  ]
}


================================================
FILE: demo/assets/example-schemas/ng-jsf-simple-array.json
================================================
{
  "schema": {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "title": "Item",
          "default": "New Item"
        }
      }
    }
  },
  "data": {
    "items": [ "Item 1", "Item 2", "Item 3", "Item 4" ]
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-alternatives.json
================================================
{
  "schema": {
    "definitions": {
      "Color": {
        "title": "Color",
        "type": "string",
        "anyOf": [
          { "type": "string", "enum": [ "#ff0000" ], "title": "Red" },
          { "type": "string", "enum": [ "#00ff00" ], "title": "Green" },
          { "type": "string", "enum": [ "#0000ff" ], "title": "Blue" }
        ]
      }
    },
    "title": "Image editor",
    "type": "object",
    "properties": {
      "currentColor": { "$ref": "#/definitions/Color", "title": "Brush color" },
      "colorMask": {
        "title": "Color mask",
        "type": "array",
        "items": { "$ref": "#/definitions/Color" },
        "uniqueItems": true
      },
      "colorPalette": {
        "title": "Color palette",
        "type": "array",
        "items": { "$ref": "#/definitions/Color" }
      },
      "blendMode": {
        "title": "Blend mode",
        "type": "string",
        "enum": [ "screen", "multiply", "overlay" ],
        "enumNames": [ "Screen", "Multiply", "Overlay" ]
      }
    },
    "required": [ "currentColor", "colorMask", "blendMode" ]
  },
  "uiSchema": {},
  "formData": {
    "currentColor": "#00ff00",
    "colorMask": [ "#0000ff" ],
    "colorPalette": [ "#ff0000" ],
    "blendMode": "screen"
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-arrays.json
================================================
{
  "schema": {
    "definitions": {
      "Thing": {
        "type": "object",
        "properties": {
          "name": { "type": "string", "default": "Default name" }
        }
      }
    },
    "type": "object",
    "properties": {
      "listOfStrings": {
        "type": "array",
        "title": "A list of strings",
        "items": { "type": "string", "default": "bazinga" }
      },
      "multipleChoicesList": {
        "type": "array",
        "title": "A multiple choices list",
        "items": { "type": "string", "enum": [ "foo", "bar", "fuzz", "qux" ] },
        "uniqueItems": true
      },
      "fixedItemsList": {
        "type": "array",
        "title": "A list of fixed items",
        "items": [
          { "title": "A string value", "type": "string", "default": "lorem ipsum" },
          { "title": "a boolean value", "type": "boolean" }
        ],
        "additionalItems": { "title": "Additional item", "type": "number" }
      },
      "minItemsList": {
        "type": "array",
        "title": "A list with a minimal number of items",
        "minItems": 3,
        "items": { "$ref": "#/definitions/Thing" }
      },
      "defaultsAndMinItems": {
        "type": "array",
        "title": "List and item level defaults",
        "minItems": 5,
        "default": [ "carp", "trout", "bream" ],
        "items": { "type": "string", "default": "unidentified" }
      },
      "nestedList": {
        "type": "array",
        "title": "Nested list",
        "items": {
          "type": "array",
          "title": "Inner list",
          "items": { "type": "string", "default": "lorem ipsum" }
        }
      },
      "unorderable": {
        "title": "Unorderable items",
        "type": "array",
        "items": { "type": "string", "default": "lorem ipsum" }
      },
      "unremovable": {
        "title": "Unremovable items",
        "type": "array",
        "items": { "type": "string", "default": "lorem ipsum" }
      },
      "noToolbar": {
        "title": "No add, remove and order buttons",
        "type": "array",
        "items": { "type": "string", "default": "lorem ipsum" }
      },
      "fixedNoToolbar": {
        "title": "Fixed array without buttons",
        "type": "array",
        "items": [
          { "title": "A number",  "type": "number", "default": 42 },
          { "title": "A boolean", "type": "boolean", "default": false }
        ],
        "additionalItems":
          { "title": "A string",  "type": "string", "default": "lorem ipsum" }
      }
    }
  },
  "uiSchema": {
    "listOfStrings": { "items": { "ui:emptyValue": "" } },
    "multipleChoicesList": { "ui:widget": "checkboxes" },
    "fixedItemsList": {
      "items": [ { "ui:widget": "textarea" }, { "ui:widget": "select" } ],
      "additionalItems": { "ui:widget": "updown" }
    },
    "unorderable": { "ui:options": {
      "orderable": false
    } },
    "unremovable": { "ui:options": {
      "removable": false
    } },
    "noToolbar": { "ui:options": {
      "addable": false, "orderable": false, "removable": false
    } },
    "fixedNoToolbar": { "ui:options": {
      "addable": false, "orderable": false, "removable": false
    } }
  },
  "formData": {
    "listOfStrings": [ "foo", "bar" ],
    "multipleChoicesList": [ "foo", "bar" ],
    "fixedItemsList": [ "Some text", true, 123 ],
    "nestedList": [ [ "lorem", "ipsum" ], [ "dolor" ] ],
    "unorderable": [ "one", "two" ],
    "unremovable": [ "one", "two" ],
    "noToolbar": [ "one", "two" ],
    "fixedNoToolbar": [ 42, true, "additional item one", "additional item two" ]
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-custom-array.json
================================================
{
  "schema": {
    "title": "Custom array of strings",
    "type": "array",
    "items": {
      "type": "string"
    }
  },
  "formData": [ "react", "jsonschema", "form" ],
  "ArrayFieldTemplate": function (props) {
    return (
      <div className={props.className}>
        {props.items &&
          props.items.map(element => (
            <div key={element.index}>
              <div>{element.children}</div>
              {element.hasMoveDown && (
                <button
                  onClick={element.onReorderClick(
                    element.index,
                    element.index + 1
                  )}>
                  Down
                </button>
              )}
              {element.hasMoveUp && (
                <button
                  onClick={element.onReorderClick(
                    element.index,
                    element.index - 1
                  )}>
                  Up
                </button>
              )}
              <button onClick={element.onDropIndexClick(element.index)}>
                Delete
              </button>
              <hr />
            </div>
          ))}

        {props.canAdd && (
          <div className="row">
            <p className="col-xs-3 col-xs-offset-9 array-item-add text-right">
              <button onClick={props.onAddClick} type="button">
                Custom +
              </button>
            </p>
          </div>
        )}
      </div>
    );
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-custom.json
================================================
{
  "schema": {
    "title": "A localisation form",
    "type": "object",
    "required": [ "lat", "lon" ],
    "properties": {
      "lat": { "type": "number" },
      "lon": { "type": "number" }
    }
  },
  "uiSchema": { "ui:field": "geo" },
  "formData": { "lat": 0, "lon": 0 }
}


================================================
FILE: demo/assets/example-schemas/rjsf-date-and-time.json
================================================
{
  "schema": {
    "title": "Date and time widgets",
    "type": "object",
    "properties": {
      "native": {
        "title": "Native",
        "description": "May not work on some browsers, notably Firefox Desktop and IE.",
        "type": "object",
        "properties": {
          "datetime": { "type": "string", "format": "date-time" },
          "date": { "type": "string", "format": "date" }
        }
      },
      "alternative": {
        "title": "Alternative",
        "description": "These work on most platforms.",
        "type": "object",
        "properties": {
          "alt-datetime": { "type": "string", "format": "date-time" },
          "alt-date": { "type": "string", "format": "date" }
        }
      }
    }
  },
  "uiSchema": {
    "alternative": {
      "alt-datetime": { "ui:widget": "alt-datetime" },
      "alt-date": { "ui:widget": "alt-date" }
    }
  },
  "formData": {}
}


================================================
FILE: demo/assets/example-schemas/rjsf-errors.json
================================================
{
  "schema": {
    "title": "Contextualized errors",
    "type": "object",
    "properties": {
      "firstName": {
        "type": "string",
        "title": "First name",
        "minLength": 8,
        "pattern": "\\d+"
      },
      "active": {
        "type": "boolean",
        "title": "Active"
      },
      "skills": {
        "type": "array",
        "items": {
          "type": "string",
          "minLength": 5
        }
      },
      "multipleChoicesList": {
        "type": "array",
        "title": "Pick max two items",
        "uniqueItems": true,
        "maxItems": 2,
        "items": {
          "type": "string",
          "enum": [ "foo", "bar", "fuzz" ]
        }
      }
    }
  },
  "uiSchema": {},
  "formData": {
    "firstName": "Chuck",
    "active": "wrong",
    "skills": [ "karate", "budo", "aikido" ],
    "multipleChoicesList": [ "foo", "bar", "fuzz" ]
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-files.json
================================================
{
  "schema": {
    "title": "Files",
    "type": "object",
    "properties": {
      "file": {
        "type": "string",
        "format": "data-url",
        "title": "Single file"
      },
      "files": {
        "type": "array",
        "title": "Multiple files",
        "items": {
          "type": "string",
          "format": "data-url"
        }
      }
    }
  },
  "uiSchema": { },
  "formData": { }
}


================================================
FILE: demo/assets/example-schemas/rjsf-large.json
================================================
{
  "schema": {
    "definitions": {
      "largeEnum": {
        "type": "string",
        "enum": [
          "option #0",  "option #1",  "option #2",  "option #3",  "option #4",
          "option #5",  "option #6",  "option #7",  "option #8",  "option #9",
          "option #10", "option #11", "option #12", "option #13", "option #14",
          "option #15", "option #16", "option #17", "option #18", "option #19",
          "option #20", "option #21", "option #22", "option #23", "option #24",
          "option #25", "option #26", "option #27", "option #28", "option #29",
          "option #30", "option #31", "option #32", "option #33", "option #34",
          "option #35", "option #36", "option #37", "option #38", "option #39",
          "option #40", "option #41", "option #42", "option #43", "option #44",
          "option #45", "option #46", "option #47", "option #48", "option #49",
          "option #50", "option #51", "option #52", "option #53", "option #54",
          "option #55", "option #56", "option #57", "option #58", "option #59",
          "option #60", "option #61", "option #62", "option #63", "option #64",
          "option #65", "option #66", "option #67", "option #68", "option #69",
          "option #70", "option #71", "option #72", "option #73", "option #74",
          "option #75", "option #76", "option #77", "option #78", "option #79",
          "option #80", "option #81", "option #82", "option #83", "option #84",
          "option #85", "option #86", "option #87", "option #88", "option #89",
          "option #90", "option #91", "option #92", "option #93", "option #94",
          "option #95", "option #96", "option #97", "option #98", "option #99" ]
      }
    },
    "title": "A rather large form",
    "type": "object",
    "properties": {
      "string":   { "type": "string", "title": "Some string" },
      "choice1":  { "$ref": "#/definitions/largeEnum" },
      "choice2":  { "$ref": "#/definitions/largeEnum" },
      "choice3":  { "$ref": "#/definitions/largeEnum" },
      "choice4":  { "$ref": "#/definitions/largeEnum" },
      "choice5":  { "$ref": "#/definitions/largeEnum" },
      "choice6":  { "$ref": "#/definitions/largeEnum" },
      "choice7":  { "$ref": "#/definitions/largeEnum" },
      "choice8":  { "$ref": "#/definitions/largeEnum" },
      "choice9":  { "$ref": "#/definitions/largeEnum" },
      "choice10": { "$ref": "#/definitions/largeEnum" }
    }
  },
  "UISchema": { "choice1": { "ui:placeholder": "Choose one" } },
  "formData": {}
}


================================================
FILE: demo/assets/example-schemas/rjsf-nested.json
================================================
{
  "schema": {
    "title": "A list of tasks",
    "type": "object",
    "required": [ "title" ],
    "properties": {
      "title": {
        "title": "Task list title",
        "type": "string"
      },
      "tasks": {
        "title": "Tasks",
        "type": "array",
        "items": {
          "type": "object",
          "required": [ "title" ],
          "properties": {
            "title": {
              "title": "Title",
              "type": "string",
              "description": "A sample title"
            },
            "details": {
              "title": "Task details",
              "type": "string",
              "description": "Enter the task details"
            },
            "done": {
              "title": "Done?",
              "type": "boolean",
              "default": false
            }
          }
        }
      }
    }
  },
  "uiSchema": {
    "tasks": { "items": { "details": { "ui:widget": "textarea" } } }
  },
  "formData": {
    "title": "My current tasks",
    "tasks": [ {
      "title": "My first task",
      "details": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
      "done": true
    }, {
      "title": "My second task",
      "details": "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur",
      "done": false
    } ]
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-numbers.json
================================================
{
  "schema": {
    "type": "object",
    "title": "Number fields & widgets",
    "properties": {
      "number": {
        "title": "Number",
        "type": "number"
      },
      "integer": {
        "title": "Integer",
        "type": "integer"
      },
      "numberEnum": {
        "type": "number",
        "title": "Number enum",
        "enum": [ 1, 2, 3 ]
      },
      "numberEnumRadio": {
        "type": "number",
        "title": "Number enum",
        "enum": [ 1, 2, 3 ]
      },
      "integerRange": {
        "title": "Integer range",
        "type": "integer",
        "minimum": 42,
        "maximum": 100
      },
      "integerRangeSteps": {
        "title": "Integer range (by 10)",
        "type": "integer",
        "minimum": 50,
        "maximum": 100,
        "multipleOf": 10
      }
    }
  },
  "uiSchema": {
    "integer": {
      "ui:widget": "updown"
    },
    "numberEnumRadio": { "ui:widget": "radio", "ui:options": { "inline": true } },
    "integerRange": {
      "ui:widget": "range"
    },
    "integerRangeSteps": {
      "ui:widget": "range"
    }
  },
  "formData": {
    "number": 3.14,
    "integer": 42,
    "numberEnum": 2,
    "integerRange": 42,
    "integerRangeSteps": 80
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-ordering.json
================================================
{
  "schema": {
    "title": "A registration form",
    "type": "object",
    "properties": {
      "password":  { "type": "string",  "title": "Password" },
      "lastName":  { "type": "string",  "title": "Last name" },
      "bio":       { "type": "string",  "title": "Bio" },
      "firstName": { "type": "string",  "title": "First name" },
      "age":       { "type": "integer", "title": "Age" }
    },
    "required": [ "firstName", "lastName" ]
  },
  "uiSchema": {
    "ui:order": [ "firstName", "lastName", "*", "password" ],
    "age": { "ui:widget": "updown" },
    "bio": { "ui:widget": "textarea" },
    "password": { "ui:widget": "password" }
  },
  "formData": {
    "firstName": "Chuck",
    "lastName": "Norris",
    "age": 75,
    "bio": "Roundhouse kicking asses since 1940",
    "password": "noneed"
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-references.json
================================================
{
  "schema": {
    "definitions": {
      "address": {
        "type": "object",
        "properties": {
          "street_address": { "type": "string" },
          "city": { "type": "string" },
          "state": { "type": "string" }
        },
        "required": [ "street_address", "city", "state" ]
      },
      "node": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "children": {
            "type": "array",
            "items": { "$ref": "#/definitions/node" }
          }
        }
      }
    },
    "type": "object",
    "properties": {
      "billing_address": {
        "title": "Billing address",
        "$ref": "#/definitions/address"
      },
      "shipping_address": {
        "title": "Shipping address",
        "$ref": "#/definitions/address"
      },
      "tree": {
        "title": "Recursive references",
        "$ref": "#/definitions/node"
      }
    }
  },
  "uiSchema": {
    "ui:order": [ "shipping_address", "billing_address", "tree" ]
  },
  "formData": {
    "billing_address": {
      "street_address": "21, Jump Street",
      "city": "Babel",
      "state": "Neverland"
    },
    "shipping_address": {
      "street_address": "221B, Baker Street",
      "city": "London",
      "state": "N/A"
    },
    "tree": {
      "name": "root",
      "children": [ { "name": "leaf" } ]
    }
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-simple.json
================================================
{
  "schema": {
    "title": "A registration form",
    "description": "A simple form example.",
    "type": "object",
    "required": [ "firstName", "lastName" ],
    "properties": {
      "firstName": { "type": "string", "title": "First name" },
      "lastName": { "type": "string", "title": "Last name" },
      "age": { "type": "integer", "title": "Age" },
      "bio": { "type": "string", "title": "Bio" },
      "password": { "type": "string", "title": "Password", "minLength": 3 },
      "telephone": { "type": "string", "title": "Telephone", "minLength": 10 }
    }
  },
  "uiSchema": {
    "firstName": {
      "ui:autofocus": true,
      "ui:emptyValue": ""
    },
    "age": {
      "ui:widget": "updown",
      "ui:title": "Age of person",
      "ui:description": "(earthian year)"
    },
    "bio": {
      "ui:widget": "textarea"
    },
    "password": {
      "ui:widget": "password",
      "ui:help": "Hint: Make it strong!"
    },
    "date": {
      "ui:widget": "alt-datetime"
    },
    "telephone": {
      "ui:options": { "inputType": "tel" }
    }
  },
  "formData": {
    "firstName": "Chuck",
    "lastName": "Norris",
    "age": 75,
    "bio": "Roundhouse kicking asses since 1940",
    "password": "noneed"
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-single.json
================================================
{
  "schema": {
    "title": "A single-field form",
    "type": "string"
  },
  "formData": "initial value",
  "uiSchema": { }
}


================================================
FILE: demo/assets/example-schemas/rjsf-validation.json
================================================
{
  "schema": {
    "title": "Custom validation",
    "description" :
      "This form defines custom validation rules checking that the two passwords match.",
    "type": "object",
    "properties": {
      "pass1": {
        "title": "Password",
        "type": "string",
        "minLength": 3
      },
      "pass2": {
        "title": "Repeat password",
        "type": "string",
        "minLength": 3
      },
      "age": {
        "title": "Age",
        "type": "number",
        "minimum": 18
      }
    }
  },
  "uiSchema": {
    "pass1": { "ui:widget": "password" },
    "pass2": { "ui:widget": "password" }
  },
  "formData": {},
  "validate": function ({ pass1, pass2 }, errors) {
    if (pass1 !== pass2) {
      errors.pass2.addError("Passwords don't match.");
    }
    return errors;
  },
  "transformErrors": function(errors) {
    return errors.map(error => {
      if (error.name === "minimum" && error.property === "instance.age") {
        return Object.assign({}, error, {
          message: "You need to be 18 because of some legal thing",
        });
      }
      return error;
    });
  }
}


================================================
FILE: demo/assets/example-schemas/rjsf-widgets.json
================================================
{
  "schema": {
    "title": "Widgets",
    "type": "object",
    "properties": {
      "stringFormats": {
        "type": "object",
        "title": "String formats",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "uri": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "boolean": {
        "type": "object",
        "title": "Boolean field",
        "properties": {
          "default": {
            "type": "boolean",
            "title": "checkbox (default)",
            "description": "This is the checkbox-description"
          },
          "radio": {
            "type": "boolean",
            "title": "radio buttons",
            "description": "This is the radio-description"
          },
          "select": {
            "type": "boolean",
            "title": "select box",
            "description": "This is the select-description"
          }
        }
      },
      "string": {
        "type": "object",
        "title": "String field",
        "properties": {
          "default": {
            "type": "string",
            "title": "text input (default)"
          },
          "textarea": {
            "type": "string",
            "title": "textarea"
          },
          "color": {
            "type": "string",
            "title": "color picker",
            "default": "#151ce6"
          }
        }
      },
      "secret": {
        "type": "string",
        "default": "I'm a hidden string."
      },
      "disabled": {
        "type": "string",
        "title": "A disabled field",
        "default": "I am disabled."
      },
      "readonly": {
        "type": "string",
        "title": "A readonly field",
        "default": "I am read-only."
      },
      "widgetOptions": {
        "title": "Custom widget with options",
        "type": "string",
        "default": "I am yellow"
      },
      "selectWidgetOptions": {
        "title": "Custom select widget with options",
        "type": "string",
        "enum": [ "foo", "bar" ],
        "enumNames": [ "Foo", "Bar" ]
      }
    }
  },
  "uiSchema": {
    "boolean": {
      "radio": { "ui:widget": "radio" },
      "select": { "ui:widget": "select" }
    },
    "string": {
      "textarea": { "ui:widget": "textarea", "ui:options": { "rows": 5 } },
      "color": { "ui:widget": "color" }
    },
    "secret": { "ui:widget": "hidden" },
    "disabled": { "ui:disabled": true },
    "readonly": { "ui:readonly": true },
    "widgetOptions": {
      "ui:widget": function ({ value, onChange, options }) {
        const { backgroundColor } = options;
        return (
          <input
            className="form-control"
            onChange={event => onChange(event.target.value)}
            style={{backgroundColor}}
            value={value}
          />
        );
      },
      "ui:options": { "backgroundColor": "yellow" }
    },
    "selectWidgetOptions": {
      "ui:widget": function ({ value, onChange, options }) {
        const { enumOptions, backgroundColor } = options;
        return (
          <select
            className="form-control"
            style={{backgroundColor}}
            value={value}
            onChange={event => onChange(event.target.value)}>
            {enumOptions.map(({ label, value }, i) => {
              return (
                <option key={i} value={value}>
                  {label}
                </option>
              );
            })}
          </select>
        );
      },
      "ui:options": { "backgroundColor": "pink" }
    }
  },
  "formData": {
    "stringFormats": {
      "email": "chuck@norris.net",
      "uri": "http://chucknorris.com/"
    },
    "boolean": {
      "default": true,
      "radio": true,
      "select": true
    },
    "string": {
      "default": "Hello...",
      "textarea": "... World"
    },
    "secret": "I'm a hidden string."
  }
}


================================================
FILE: demo/assets/example-schemas/sources.md
================================================
Sources:

* ng-jsf-...json files are new examples created for angular json schema form

* json-schema-draft...json files are JSON Meta-Schemas,
  [available here](http://json-schema.org/specification-links.html)

* asf-...json files are Angular Schema Form (AngularJS) compatibility examples,
  [available here](http://schemaform.io/examples/bootstrap-example.html)

* jsf-...json files are JSONForm (jQuery) compatibility examples,
  [available here](http://ulion.github.io/jsonform/playground/)

* rjsf-...json files are React JSON Schema Form compatibility examples,
  [available here](https://mozilla-services.github.io/react-jsonschema-form/)


================================================
FILE: demo/environments/environment.prod.ts
================================================
export const environment = { production: true };


================================================
FILE: demo/environments/environment.ts
================================================
export const environment = { production: false };


================================================
FILE: demo/index.html
================================================
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Angular JSON Schema Form—Demonstration Playground</title>
    <base href="/">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
  </head>
  <body>
    <demo-root>Loading...</demo-root>
  </body>
</html>


================================================
FILE: demo/karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage'),
      require('@angular-devkit/build-angular/plugins/karma'),
    ],
    client: {
      clearContext: false, // leave Jasmine Spec Runner output visible in browser
    },
    coverageReporter: {
      dir: require('path').join(__dirname, '../coverage'),
      reporters: [
        {
          type: 'html',
        },
        {
          type: 'lcov',
        },
        {
          type: 'text-summary',
        },
      ],
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    singleRun: false,
    browsers: ['Chrome', 'ChromeHeadlessCI'],
    customLaunchers: {
      ChromeHeadlessCI: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox'],
      },
    },
  });
};


================================================
FILE: demo/main.ts
================================================
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { DemoModule } from './app/demo.module';
import { environment } from './environments/environment';

if (environment.production) { enableProdMode(); }

platformBrowserDynamic().bootstrapModule(DemoModule);


================================================
FILE: demo/polyfills.ts
================================================
/**
 * This file includes polyfills needed by Angular and is loaded before the app.
 * You can add your own extra polyfills to this file.
 *
 * This file is divided into 2 sections:
 *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
 *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
 *      file.
 *
 * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
 * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
 * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
 *
 * Learn more in https://angular.io/guide/browser-support
 */

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

/**
 * By default, zone.js will patch all possible macroTask and DomEvents
 * user can disable parts of macroTask/DomEvents patch by setting following flags
 * because those flags need to be set before `zone.js` being loaded, and webpack
 * will put import in the top of bundle, so user need to create a separate file
 * in this directory (for example: zone-flags.ts), and put the following flags
 * into that file, and then add the following code before importing zone.js.
 * import './zone-flags.ts';
 *
 * The flags allowed in zone-flags.ts are listed here.
 *
 * The following flags will work for all browsers.
 *
 * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
 * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
 * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
 *
 *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
 *  with the following flag, it will bypass `zone.js` patch for IE/Edge
 *
 *  (window as any).__Zone_enable_cross_context_check = true;
 *
 */

/***************************************************************************************************
 * Zone JS is required by default for Angular itself.
 */
import 'zone.js';  // Included with Angular CLI.


================================================
FILE: demo/styles.scss
================================================
// * { border: 1px solid red !important; }
@use '@angular/material' as mat;
@include mat.core();
$demo-app-primary: mat.define-palette(mat.$blue-palette);
$demo-app-accent:  mat.define-palette(mat.$amber-palette, A200, A100, A400);
$demo-app-warn:    mat.define-palette(mat.$red-palette);
$demo-app-theme:   mat.define-light-theme($demo-app-primary, $demo-app-accent, $demo-app-warn);
@include mat.all-component-themes($demo-app-theme);

$font-family: 'Roboto', 'Noto', 'Helvetica Neue', sans-serif;
$row-height: 56px;

mat-toolbar {
  &.mat-medium {
    min-height: $row-height;
    mat-toolbar-row { height: $row-height; }
  }
}

body {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  background-color: rgb(250, 250, 250) !important;
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  font-family: $font-family;
  height: 100%;
  margin: 0;
  padding: 0;
}

.demo-page-header {
  background-color: mat.get-color-from-palette($demo-app-primary, lighter);
  margin-bottom: 12px;
  .header-content {
    font-family: $font-family;
    line-height: 1.4em;
    padding: 12px;
    .menu-label {
      margin-right: 12px;
      font-weight: bold;
    }
  }
}

.ace_active-line { background: none !important; }

[ace-editor], .data-good, .data-bad {
  border-radius: 3px;
  padding: 6px;
  border: 1px solid #ccc !important;
}

[ace-editor] { background-color: rgb(253, 253, 253) !important; }

.avoidwrap { display:inline-block; }

.data-good { background-color: #dfd; }

.data-bad { background-color: #fcc; }

.default-cursor:hover { cursor: default; }

.check-row { margin-top: 8px; }

.cdk-overlay-container .cdk-overlay-pane .mat-menu-panel { max-width: 560px; }

.debug { border: 1px solid red !important; }

.mat-input-container.mat-form-field { width: 100%; }


================================================
FILE: demo/test.ts
================================================
// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare var __karma__: any;
declare var require: any;

// Prevent Karma from running prematurely.
__karma__.loaded = function () {};

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(), {
    teardown: { destroyAfterEach: false }
}
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
// Finally, start Karma to run the tests.
__karma__.start();


================================================
FILE: demo/tsconfig.app.json
================================================
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": []
  },
  "files": [
    "main.ts",
    "polyfills.ts"
  ],
  "include": [
    "demo/**/*.d.ts"
  ]
}

================================================
FILE: demo/tsconfig.spec.json
================================================
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/spec",
    "types": [
      "jasmine",
      "node"
    ]
  },
  "files": [
    "test.ts",
    "polyfills.ts"
  ],
  "include": [
    "**/*.spec.ts",
    "**/*.d.ts"
  ]
}


================================================
FILE: demo/tslint.json
================================================
{
    "extends": "../tslint.json",
    "rules": {
        "directive-selector": [
            true,
            "attribute",
            "app",
            "camelCase"
        ],
        "component-selector": [
            true,
            "element"
Download .txt
gitextract_hea3k8sd/

├── .browserslistrc
├── .editorconfig
├── .github/
│   └── workflows/
│       ├── ci.yml
│       ├── codeql-analysis.yml
│       ├── dependabot.yml
│       ├── deploy.yml
│       └── stale.yml
├── .gitignore
├── .nvmrc
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── angular.json
├── demo/
│   ├── app/
│   │   ├── ace-editor.directive.ts
│   │   ├── demo-root.component.ts
│   │   ├── demo.component.html
│   │   ├── demo.component.ts
│   │   ├── demo.module.ts
│   │   ├── demo.routes.ts
│   │   └── example-schemas.model.ts
│   ├── assets/
│   │   └── example-schemas/
│   │       ├── asf-array.json
│   │       ├── asf-basic-json-schema-type.json
│   │       ├── asf-bootstrap-grid.json
│   │       ├── asf-complex-key-support.json
│   │       ├── asf-hack-conditional-required.json
│   │       ├── asf-kitchen-sink.json
│   │       ├── asf-simple.json
│   │       ├── asf-tab-array.json
│   │       ├── asf-titlemap-examples.json
│   │       ├── jsf-events.json
│   │       ├── jsf-factory-sleek.json
│   │       ├── jsf-fields-ace.json
│   │       ├── jsf-fields-actions.json
│   │       ├── jsf-fields-advancedfieldset.json
│   │       ├── jsf-fields-array-simple.json
│   │       ├── jsf-fields-array.json
│   │       ├── jsf-fields-authfieldset.json
│   │       ├── jsf-fields-autocomplete.json
│   │       ├── jsf-fields-checkbox.json
│   │       ├── jsf-fields-checkboxbuttons.json
│   │       ├── jsf-fields-checkboxes.json
│   │       ├── jsf-fields-color.json
│   │       ├── jsf-fields-common.json
│   │       ├── jsf-fields-fieldset.json
│   │       ├── jsf-fields-help.json
│   │       ├── jsf-fields-hidden.json
│   │       ├── jsf-fields-iconselect.json
│   │       ├── jsf-fields-imageselect.json
│   │       ├── jsf-fields-password.json
│   │       ├── jsf-fields-questions.json
│   │       ├── jsf-fields-radiobuttons.json
│   │       ├── jsf-fields-radios.json
│   │       ├── jsf-fields-range.json
│   │       ├── jsf-fields-section.json
│   │       ├── jsf-fields-select.json
│   │       ├── jsf-fields-selectfieldset-key.json
│   │       ├── jsf-fields-selectfieldset.json
│   │       ├── jsf-fields-submit.json
│   │       ├── jsf-fields-tabarray-maxitems.json
│   │       ├── jsf-fields-tabarray-value.json
│   │       ├── jsf-fields-tabarray.json
│   │       ├── jsf-fields-textarea.json
│   │       ├── jsf-gettingstarted.json
│   │       ├── jsf-previousvalues-multidimensional.json
│   │       ├── jsf-previousvalues.json
│   │       ├── jsf-schema-array.json
│   │       ├── jsf-schema-basic.json
│   │       ├── jsf-schema-default.json
│   │       ├── jsf-schema-inlineref.json
│   │       ├── jsf-schema-morecomplex.json
│   │       ├── jsf-schema-required.json
│   │       ├── jsf-templating-idx.json
│   │       ├── jsf-templating-tpldata.json
│   │       ├── jsf-templating-value.json
│   │       ├── jsf-templating-values.json
│   │       ├── json-schema-draft01.json
│   │       ├── json-schema-draft02.json
│   │       ├── json-schema-draft03.json
│   │       ├── json-schema-draft04.json
│   │       ├── json-schema-draft06.json
│   │       ├── ng-jsf-data-only.json
│   │       ├── ng-jsf-deep-ref.json
│   │       ├── ng-jsf-flex-layout.json
│   │       ├── ng-jsf-layout-only.json
│   │       ├── ng-jsf-nested-arrays.json
│   │       ├── ng-jsf-select-list-examples.json
│   │       ├── ng-jsf-select-widget-examples.json
│   │       ├── ng-jsf-simple-array.json
│   │       ├── rjsf-alternatives.json
│   │       ├── rjsf-arrays.json
│   │       ├── rjsf-custom-array.json
│   │       ├── rjsf-custom.json
│   │       ├── rjsf-date-and-time.json
│   │       ├── rjsf-errors.json
│   │       ├── rjsf-files.json
│   │       ├── rjsf-large.json
│   │       ├── rjsf-nested.json
│   │       ├── rjsf-numbers.json
│   │       ├── rjsf-ordering.json
│   │       ├── rjsf-references.json
│   │       ├── rjsf-simple.json
│   │       ├── rjsf-single.json
│   │       ├── rjsf-validation.json
│   │       ├── rjsf-widgets.json
│   │       └── sources.md
│   ├── environments/
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── index.html
│   ├── karma.conf.js
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.scss
│   ├── test.ts
│   ├── tsconfig.app.json
│   ├── tsconfig.spec.json
│   └── tslint.json
├── docs/
│   └── issue_template.md
├── e2e/
│   ├── protractor.conf.js
│   ├── src/
│   │   ├── app.e2e-spec.ts
│   │   └── app.po.ts
│   └── tsconfig.e2e.json
├── package.json
├── projects/
│   ├── ajsf-bootstrap3/
│   │   ├── README.md
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── bootstrap3-framework.component.html
│   │   │   │   ├── bootstrap3-framework.component.scss
│   │   │   │   ├── bootstrap3-framework.component.spec.ts
│   │   │   │   ├── bootstrap3-framework.component.ts
│   │   │   │   ├── bootstrap3-framework.module.ts
│   │   │   │   └── bootstrap3.framework.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── ajsf-bootstrap4/
│   │   ├── README.md
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── bootstrap4-framework.component.html
│   │   │   │   ├── bootstrap4-framework.component.scss
│   │   │   │   ├── bootstrap4-framework.component.spec.ts
│   │   │   │   ├── bootstrap4-framework.component.ts
│   │   │   │   ├── bootstrap4-framework.module.ts
│   │   │   │   └── bootstrap4.framework.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── ajsf-core/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── lib/
│   │   │   │   ├── framework-library/
│   │   │   │   │   ├── framework-library.service.ts
│   │   │   │   │   ├── framework.ts
│   │   │   │   │   ├── no-framework.component.html
│   │   │   │   │   ├── no-framework.component.ts
│   │   │   │   │   ├── no-framework.module.ts
│   │   │   │   │   └── no.framework.ts
│   │   │   │   ├── json-schema-form.component.html
│   │   │   │   ├── json-schema-form.component.ts
│   │   │   │   ├── json-schema-form.module.ts
│   │   │   │   ├── json-schema-form.service.ts
│   │   │   │   ├── locale/
│   │   │   │   │   ├── de-validation-messages.ts
│   │   │   │   │   ├── en-validation-messages.ts
│   │   │   │   │   ├── es-validation-messages.ts
│   │   │   │   │   ├── fr-validation-messages.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── it-validation-messages.ts
│   │   │   │   │   ├── pt-validation-messages.ts
│   │   │   │   │   └── zh-validation-messages.ts
│   │   │   │   ├── locale-dates/
│   │   │   │   │   └── en-US.ts
│   │   │   │   ├── shared/
│   │   │   │   │   ├── convert-schema-to-draft6.function.ts
│   │   │   │   │   ├── form-group.functions.ts
│   │   │   │   │   ├── format-regex.constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── json-schema.functions.ts
│   │   │   │   │   ├── json.validators.ts
│   │   │   │   │   ├── jsonpointer.functions.ts
│   │   │   │   │   ├── jspointer.functions.json.spec.ts
│   │   │   │   │   ├── layout.functions.ts
│   │   │   │   │   ├── merge-schemas.function.ts
│   │   │   │   │   ├── utility.functions.ts
│   │   │   │   │   ├── validator.functions.spec.ts
│   │   │   │   │   └── validator.functions.ts
│   │   │   │   └── widget-library/
│   │   │   │       ├── add-reference.component.ts
│   │   │   │       ├── button.component.ts
│   │   │   │       ├── checkbox.component.ts
│   │   │   │       ├── checkboxes.component.ts
│   │   │   │       ├── file.component.ts
│   │   │   │       ├── hidden.component.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── input.component.ts
│   │   │   │       ├── message.component.ts
│   │   │   │       ├── none.component.ts
│   │   │   │       ├── number.component.ts
│   │   │   │       ├── one-of.component.ts
│   │   │   │       ├── orderable.directive.ts
│   │   │   │       ├── radios.component.ts
│   │   │   │       ├── root.component.ts
│   │   │   │       ├── section.component.ts
│   │   │   │       ├── select-framework.component.ts
│   │   │   │       ├── select-widget.component.ts
│   │   │   │       ├── select.component.ts
│   │   │   │       ├── submit.component.ts
│   │   │   │       ├── tab.component.ts
│   │   │   │       ├── tabs.component.ts
│   │   │   │       ├── template.component.ts
│   │   │   │       ├── textarea.component.ts
│   │   │   │       ├── widget-library.module.ts
│   │   │   │       └── widget-library.service.ts
│   │   │   ├── public_api.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── ajsf-material/
│       ├── README.md
│       ├── karma.conf.js
│       ├── ng-package.json
│       ├── package.json
│       ├── src/
│       │   ├── lib/
│       │   │   ├── angular-flex-monkey-patch.ts
│       │   │   ├── material-design-framework.component.html
│       │   │   ├── material-design-framework.component.scss
│       │   │   ├── material-design-framework.component.spec.ts
│       │   │   ├── material-design-framework.component.ts
│       │   │   ├── material-design-framework.module.ts
│       │   │   ├── material-design.framework.ts
│       │   │   └── widgets/
│       │   │       ├── flex-layout-root.component.html
│       │   │       ├── flex-layout-root.component.ts
│       │   │       ├── flex-layout-section.component.ts
│       │   │       ├── material-add-reference.component.ts
│       │   │       ├── material-button-group.component.ts
│       │   │       ├── material-button.component.ts
│       │   │       ├── material-checkbox.component.ts
│       │   │       ├── material-checkboxes.component.ts
│       │   │       ├── material-chip-list.component.ts
│       │   │       ├── material-datepicker.component.ts
│       │   │       ├── material-file.component.ts
│       │   │       ├── material-input.component.ts
│       │   │       ├── material-number.component.ts
│       │   │       ├── material-one-of.component.ts
│       │   │       ├── material-radios.component.ts
│       │   │       ├── material-select.component.ts
│       │   │       ├── material-slider.component.ts
│       │   │       ├── material-stepper.component.ts
│       │   │       ├── material-tabs.component.ts
│       │   │       ├── material-textarea.component.ts
│       │   │       └── public_api.ts
│       │   ├── public_api.ts
│       │   └── test.ts
│       ├── tsconfig.lib.json
│       ├── tsconfig.lib.prod.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── tsconfig.json
└── tslint.json
Download .txt
SYMBOL INDEX (493 symbols across 80 files)

FILE: demo/app/ace-editor.directive.ts
  class AceEditorDirective (line 12) | class AceEditorDirective {
    method constructor (line 24) | constructor(elementRef: ElementRef) {
    method init (line 31) | init() {
    method initEvents (line 42) | initEvents() {
    method options (line 52) | set options(options: any) {
    method readOnly (line 57) | set readOnly(readOnly: any) {
    method theme (line 62) | set theme(theme: any) {
    method mode (line 67) | set mode(mode: any) {
    method text (line 72) | set text(text: any) {
    method autoUpdateContent (line 83) | set autoUpdateContent(status: any) {

FILE: demo/app/demo-root.component.ts
  class DemoRootComponent (line 8) | class DemoRootComponent { }

FILE: demo/app/demo.component.ts
  class DemoComponent (line 27) | class DemoComponent implements OnInit {
    method constructor (line 84) | constructor(
    method ngOnInit (line 90) | ngOnInit() {
    method onSubmit (line 119) | onSubmit(data: any) {
    method prettySubmittedFormData (line 123) | get prettySubmittedFormData() {
    method onChanges (line 127) | onChanges(data: any) {
    method prettyLiveFormData (line 131) | get prettyLiveFormData() {
    method isValid (line 135) | isValid(isValid: boolean): void {
    method validationErrors (line 139) | validationErrors(data: any): void {
    method prettyValidationErrors (line 143) | get prettyValidationErrors() {
    method loadSelectedExample (line 163) | loadSelectedExample(
    method loadSelectedLanguage (line 196) | loadSelectedLanguage() {
    method generateForm (line 202) | generateForm(newFormString: string) {
    method toggleVisible (line 242) | toggleVisible(item: string) {
    method toggleFormOption (line 246) | toggleFormOption(option: string) {

FILE: demo/app/demo.module.ts
  class DemoModule (line 39) | class DemoModule { }

FILE: e2e/protractor.conf.js
  method onPrepare (line 22) | onPrepare() {

FILE: e2e/src/app.po.ts
  class AppPage (line 4) | class AppPage {
    method navigateTo (line 5) | navigateTo(): wdpromise.Promise<any> {
    method getParagraphText (line 9) | getParagraphText(): wdpromise.Promise<string> {

FILE: projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.component.ts
  class Bootstrap3FrameworkComponent (line 15) | class Bootstrap3FrameworkComponent implements OnInit, OnChanges {
    method constructor (line 29) | constructor(
    method showRemoveButton (line 35) | get showRemoveButton(): boolean {
    method ngOnInit (line 55) | ngOnInit() {
    method ngOnChanges (line 66) | ngOnChanges() {
    method initializeFramework (line 72) | initializeFramework() {
    method updateHelpBlock (line 213) | updateHelpBlock(status) {
    method setTitle (line 221) | setTitle(): string {
    method removeItem (line 251) | removeItem() {

FILE: projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.module.ts
  class Bootstrap3FrameworkModule (line 34) | class Bootstrap3FrameworkModule {

FILE: projects/ajsf-bootstrap3/src/lib/bootstrap3.framework.ts
  class Bootstrap3Framework (line 9) | class Bootstrap3Framework extends Framework {

FILE: projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.component.ts
  class Bootstrap4FrameworkComponent (line 22) | class Bootstrap4FrameworkComponent implements OnInit, OnChanges {
    method constructor (line 36) | constructor(
    method showRemoveButton (line 42) | get showRemoveButton(): boolean {
    method ngOnInit (line 62) | ngOnInit() {
    method ngOnChanges (line 73) | ngOnChanges() {
    method initializeFramework (line 79) | initializeFramework() {
    method updateHelpBlock (line 218) | updateHelpBlock(status) {
    method setTitle (line 226) | setTitle(): string {
    method removeItem (line 256) | removeItem() {

FILE: projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.module.ts
  class Bootstrap4FrameworkModule (line 34) | class Bootstrap4FrameworkModule {

FILE: projects/ajsf-bootstrap4/src/lib/bootstrap4.framework.ts
  class Bootstrap4Framework (line 9) | class Bootstrap4Framework extends Framework {

FILE: projects/ajsf-core/src/lib/framework-library/framework-library.service.ts
  class FrameworkLibraryService (line 17) | class FrameworkLibraryService {
    method constructor (line 25) | constructor(
    method setLoadExternalAssets (line 36) | public setLoadExternalAssets(loadExternalAssets = true): void {
    method setFramework (line 40) | public setFramework(
    method registerFrameworkWidgets (line 53) | registerFrameworkWidgets(framework: Framework): boolean {
    method hasFramework (line 59) | public hasFramework(type: string): boolean {
    method getFramework (line 63) | public getFramework(): any {
    method getFrameworkWidgets (line 68) | public getFrameworkWidgets(): any {
    method getFrameworkStylesheets (line 72) | public getFrameworkStylesheets(load: boolean = this.loadExternalAssets...
    method getFrameworkScripts (line 76) | public getFrameworkScripts(load: boolean = this.loadExternalAssets): s...

FILE: projects/ajsf-core/src/lib/framework-library/framework.ts
  class Framework (line 4) | class Framework {

FILE: projects/ajsf-core/src/lib/framework-library/no-framework.component.ts
  class NoFrameworkComponent (line 7) | class NoFrameworkComponent {

FILE: projects/ajsf-core/src/lib/framework-library/no-framework.module.ts
  class NoFrameworkModule (line 18) | class NoFrameworkModule { }

FILE: projects/ajsf-core/src/lib/framework-library/no.framework.ts
  class NoFramework (line 7) | class NoFramework extends Framework {

FILE: projects/ajsf-core/src/lib/json-schema-form.component.ts
  constant JSON_SCHEMA_FORM_VALUE_ACCESSOR (line 34) | const JSON_SCHEMA_FORM_VALUE_ACCESSOR: any = {
  class JsonSchemaFormComponent (line 83) | class JsonSchemaFormComponent implements ControlValueAccessor, OnChanges...
    method value (line 131) | get value(): any {
    method value (line 134) | set value(value: any) {
    method constructor (line 158) | constructor(
    method resetScriptsAndStyleSheets (line 165) | private resetScriptsAndStyleSheets() {
    method loadScripts (line 168) | private loadScripts() {
    method loadStyleSheets (line 179) | private loadStyleSheets() {
    method loadAssets (line 189) | private loadAssets() {
    method ngOnInit (line 194) | ngOnInit() {
    method ngOnChanges (line 199) | ngOnChanges(changes: SimpleChanges) {
    method writeValue (line 210) | writeValue(value: any) {
    method registerOnChange (line 215) | registerOnChange(fn: Function) {
    method registerOnTouched (line 219) | registerOnTouched(fn: Function) {
    method setDisabledState (line 223) | setDisabledState(isDisabled: boolean) {
    method updateForm (line 230) | updateForm() {
    method setFormValues (line 277) | setFormValues(formValues: any, resetFirst = true) {
    method submitForm (line 296) | submitForm() {
    method initializeForm (line 321) | initializeForm() {
    method initializeOptions (line 387) | private initializeOptions() {
    method initializeSchema (line 436) | private initializeSchema() {
    method initializeData (line 530) | private initializeData() {
    method initializeLayout (line 582) | private initializeLayout() {
    method activateForm (line 674) | private activateForm() {

FILE: projects/ajsf-core/src/lib/json-schema-form.module.ts
  class JsonSchemaFormModule (line 16) | class JsonSchemaFormModule {

FILE: projects/ajsf-core/src/lib/json-schema-form.service.ts
  type TitleMapItem (line 39) | interface TitleMapItem {
  type ErrorMessages (line 46) | interface ErrorMessages {
  class JsonSchemaFormService (line 54) | class JsonSchemaFormService {
    method constructor (line 146) | constructor() {
    method setLanguage (line 151) | setLanguage(language: string = 'en-US') {
    method getData (line 171) | getData() {
    method getSchema (line 175) | getSchema() {
    method getLayout (line 179) | getLayout() {
    method resetAllValues (line 183) | resetAllValues() {
    method buildRemoteError (line 228) | buildRemoteError(errors: ErrorMessages) {
    method validateData (line 240) | validateData(newValue: any, updateSubscriptions = true): void {
    method buildFormGroupTemplate (line 270) | buildFormGroupTemplate(formValues: any = null, setValues = true) {
    method buildFormGroup (line 278) | buildFormGroup() {
    method buildLayout (line 294) | buildLayout(widgetLibrary: any) {
    method setOptions (line 298) | setOptions(newOptions: any) {
    method compileAjvSchema (line 331) | compileAjvSchema() {
    method buildSchemaFromData (line 343) | buildSchemaFromData(data?: any, requireAllFields = false): any {
    method buildSchemaFromLayout (line 350) | buildSchemaFromLayout(layout?: any): any {
    method setTpldata (line 357) | setTpldata(newTpldata: any = {}): void {
    method parseText (line 361) | parseText(
    method parseExpression (line 375) | parseExpression(
    method setArrayItemTitle (line 452) | setArrayItemTitle(
    method setItemTitle (line 486) | setItemTitle(ctx: any) {
    method evaluateCondition (line 497) | evaluateCondition(layoutNode: any, dataIndex: number[]): boolean {
    method initializeControl (line 535) | initializeControl(ctx: any, bind = true): boolean {
    method formatErrors (line 589) | formatErrors(errors: any, validationMessages: any = {}): string {
    method updateValue (line 649) | updateValue(ctx: any, value: any): void {
    method updateArrayCheckboxList (line 673) | updateArrayCheckboxList(ctx: any, checkboxList: TitleMapItem[]): void {
    method getFormControl (line 699) | getFormControl(ctx: any): AbstractControl {
    method getFormControlValue (line 710) | getFormControlValue(ctx: any): AbstractControl {
    method getFormControlGroup (line 722) | getFormControlGroup(ctx: any): UntypedFormArray | UntypedFormGroup {
    method getFormControlName (line 729) | getFormControlName(ctx: any): string {
    method getLayoutArray (line 740) | getLayoutArray(ctx: any): any[] {
    method getParentNode (line 744) | getParentNode(ctx: any): any {
    method getDataPointer (line 748) | getDataPointer(ctx: any): string {
    method getLayoutPointer (line 763) | getLayoutPointer(ctx: any): string {
    method isControlBound (line 770) | isControlBound(ctx: any): boolean {
    method addItem (line 783) | addItem(ctx: any, name?: string): boolean {
    method moveArrayItem (line 830) | moveArrayItem(ctx: any, oldIndex: number, newIndex: number): boolean {
    method removeItem (line 856) | removeItem(ctx: any): boolean {

FILE: projects/ajsf-core/src/lib/shared/convert-schema-to-draft6.function.ts
  type OptionObject (line 19) | interface OptionObject { changed?: boolean; draft?: number; }
  function convertSchemaToDraft6 (line 20) | function convertSchemaToDraft6(schema, options: OptionObject = {}) {

FILE: projects/ajsf-core/src/lib/shared/form-group.functions.ts
  function buildFormGroupTemplate (line 67) | function buildFormGroupTemplate(
  function buildFormGroup (line 278) | function buildFormGroup(template: any): AbstractControl {
  function mergeValues (line 320) | function mergeValues(...valuesToMerge) {
  function setRequiredFields (line 373) | function setRequiredFields(schema: any, formControlTemplate: any): boole...
  function formatFormData (line 398) | function formatFormData(
  function getControl (line 474) | function getControl(

FILE: projects/ajsf-core/src/lib/shared/format-regex.constants.ts
  type JsonSchemaFormatNames (line 70) | type JsonSchemaFormatNames =

FILE: projects/ajsf-core/src/lib/shared/json-schema.functions.ts
  function buildSchemaFromLayout (line 56) | function buildSchemaFromLayout(layout) {
  function buildSchemaFromData (line 92) | function buildSchemaFromData(
  function getFromSchema (line 139) | function getFromSchema(schema, dataPointer, returnType = 'schema') {
  function removeRecursiveReferences (line 230) | function removeRecursiveReferences(
  function getInputType (line 261) | function getInputType(schema, layoutNode: any = null) {
  function checkInlineType (line 337) | function checkInlineType(controlType, schema, layoutNode: any = null) {
  function isInputRequired (line 374) | function isInputRequired(schema, schemaPointer) {
  function updateInputOptions (line 410) | function updateInputOptions(layoutNode, schema, jsf) {
  function getTitleMapFromOneOf (line 477) | function getTitleMapFromOneOf(
  function getControlValidators (line 519) | function getControlValidators(schema) {
  function resolveSchemaReferences (line 571) | function resolveSchemaReferences(
  function getSubSchema (line 688) | function getSubSchema(
  function combineAllOf (line 754) | function combineAllOf(schema) {
  function fixRequiredArrayProperties (line 774) | function fixRequiredArrayProperties(schema) {

FILE: projects/ajsf-core/src/lib/shared/json.validators.ts
  class JsonValidators (line 110) | class JsonValidators {
    method required (line 148) | static required(input?: AbstractControl|boolean): ValidationErrors|nul...
    method type (line 174) | static type(requiredType: SchemaPrimitiveType|SchemaPrimitiveType[]): ...
    method enum (line 198) | static enum(allowedValues: any[]): IValidatorFn {
    method const (line 233) | static const(requiredValue: any): IValidatorFn {
    method minLength (line 259) | static minLength(minimumLength: number): IValidatorFn {
    method maxLength (line 279) | static maxLength(maximumLength: number): IValidatorFn {
    method pattern (line 307) | static pattern(pattern: string|RegExp, wholeString = false): IValidato...
    method format (line 343) | static format(requiredFormat: JsonSchemaFormatNames): IValidatorFn {
    method minimum (line 382) | static minimum(minimumValue: number): IValidatorFn {
    method exclusiveMinimum (line 405) | static exclusiveMinimum(exclusiveMinimumValue: number): IValidatorFn {
    method maximum (line 429) | static maximum(maximumValue: number): IValidatorFn {
    method exclusiveMaximum (line 452) | static exclusiveMaximum(exclusiveMaximumValue: number): IValidatorFn {
    method multipleOf (line 472) | static multipleOf(multipleOfValue: number): IValidatorFn {
    method minProperties (line 493) | static minProperties(minimumProperties: number): IValidatorFn {
    method maxProperties (line 516) | static maxProperties(maximumProperties: number): IValidatorFn {
    method dependencies (line 538) | static dependencies(dependencies: any): IValidatorFn {
    method minItems (line 600) | static minItems(minimumItems: number): IValidatorFn {
    method maxItems (line 619) | static maxItems(maximumItems: number): IValidatorFn {
    method uniqueItems (line 637) | static uniqueItems(unique = true): IValidatorFn {
    method contains (line 664) | static contains(requiredItem = true): IValidatorFn {
    method nullValidator (line 681) | static nullValidator(control: AbstractControl): ValidationErrors|null {
    method composeAnyOf (line 705) | static composeAnyOf(validators: IValidatorFn[]): IValidatorFn {
    method composeOneOf (line 729) | static composeOneOf(validators: IValidatorFn[]): IValidatorFn {
    method composeAllOf (line 756) | static composeAllOf(validators: IValidatorFn[]): IValidatorFn {
    method composeNot (line 783) | static composeNot(validator: IValidatorFn): IValidatorFn {
    method compose (line 800) | static compose(validators: IValidatorFn[]): IValidatorFn {
    method composeAsync (line 814) | static composeAsync(validators: AsyncIValidatorFn[]): AsyncIValidatorFn {
    method min (line 831) | static min(min: number): ValidatorFn {
    method max (line 847) | static max(max: number): ValidatorFn {
    method requiredTrue (line 863) | static requiredTrue(control: AbstractControl): ValidationErrors|null {
    method email (line 871) | static email(control: AbstractControl): ValidationErrors|null {

FILE: projects/ajsf-core/src/lib/shared/jsonpointer.functions.ts
  type Pointer (line 29) | type Pointer = string | string[];
  class JsonPointer (line 32) | class JsonPointer {
    method get (line 47) | static get(
    method logErrors (line 91) | private static logErrors(errors, key, pointer, object) {
    method evaluateExpression (line 112) | static evaluateExpression(subObject: Object, key: any) {
    method performExpressionOnValue (line 140) | private static performExpressionOnValue(keysAndExpression: any, cleane...
    method doComparisonByExpressionType (line 149) | private static doComparisonByExpressionType(expressionType: Expression...
    method doOwnCheckResult (line 168) | private static doOwnCheckResult(subObject: Object, keysAndExpression) {
    method parseKeysAndExpression (line 187) | private static parseKeysAndExpression(key: string, subObject) {
    method keyOrSubObjEmpty (line 202) | private static keyOrSubObjEmpty(key: any, subObject: Object) {
    method getCopy (line 219) | static getCopy(
    method getFirst (line 240) | static getFirst(items, defaultValue: any = null, getCopy = false) {
    method getFirstCopy (line 283) | static getFirstCopy(items, defaultValue: any = null) {
    method set (line 309) | static set(object, pointer, value, insert = false) {
    method setCopy (line 359) | static setCopy(object, pointer, value, insert = false) {
    method insert (line 406) | static insert(object, pointer, value) {
    method insertCopy (line 421) | static insertCopy(object, pointer, value) {
    method remove (line 435) | static remove(object, pointer) {
    method has (line 461) | static has(object, pointer) {
    method dict (line 474) | static dict(object) {
    method forEachDeep (line 510) | static forEachDeep(
    method forEachDeepCopy (line 542) | static forEachDeepCopy(
    method escape (line 574) | static escape(key) {
    method unescape (line 587) | static unescape(key) {
    method parse (line 602) | static parse(pointer, errors = false) {
    method compile (line 628) | static compile(pointer, defaultValue = '', errors = false) {
    method toKey (line 655) | static toKey(pointer, errors = false) {
    method isJsonPointer (line 672) | static isJsonPointer(value) {
    method isSubPointer (line 695) | static isSubPointer(
    method toIndexedPointer (line 728) | static toIndexedPointer(
    method toGenericPointer (line 775) | static toGenericPointer(indexedPointer, arrayMap = new Map<string, num...
    method toControlPointer (line 807) | static toControlPointer(dataPointer, formGroup, controlMustExist = fal...
    method toSchemaPointer (line 850) | static toSchemaPointer(dataPointer, schema) {
    method toDataPointer (line 913) | static toDataPointer(schemaPointer, schema, errors = false) {
    method parseObjectPath (line 969) | static parseObjectPath(path) {

FILE: projects/ajsf-core/src/lib/shared/layout.functions.ts
  function buildLayout (line 52) | function buildLayout(jsf, widgetLibrary) {
  function buildLayoutFromSchema (line 500) | function buildLayoutFromSchema(
  function mapLayout (line 846) | function mapLayout(layout, fn, layoutPointer = '', rootLayout = layout) {
  function getLayoutNode (line 887) | function getLayoutNode(
  function buildTitleMap (line 944) | function buildTitleMap(

FILE: projects/ajsf-core/src/lib/shared/merge-schemas.function.ts
  function mergeSchemas (line 27) | function mergeSchemas(...schemas) {

FILE: projects/ajsf-core/src/lib/shared/utility.functions.ts
  function addClasses (line 19) | function addClasses(
  function copy (line 46) | function copy(object: any, errors = false): any {
  function forEach (line 79) | function forEach(
  function forEachCopy (line 123) | function forEachCopy(
  function hasOwn (line 156) | function hasOwn(object: any, property: string): boolean {
  type ExpressionType (line 171) | enum ExpressionType {
  function getExpressionType (line 183) | function getExpressionType(expressionCandidate: string): ExpressionType {
  function isEqual (line 195) | function isEqual(expressionType) {
  function isNotEqual (line 199) | function isNotEqual(expressionType) {
  function isNotExpression (line 203) | function isNotExpression(expressionType) {
  function getKeyAndValueByExpressionType (line 213) | function getKeyAndValueByExpressionType(expressionType: ExpressionType, ...
  function cleanValueOfQuotes (line 225) | function cleanValueOfQuotes(keyAndValue): String {
  function mergeFilteredObject (line 248) | function mergeFilteredObject(
  function uniqueItems (line 274) | function uniqueItems(...items): string[] {
  function commonItems (line 291) | function commonItems(...arrays): string[] {
  function fixTitle (line 309) | function fixTitle(name: string): string {
  function toTitleCase (line 329) | function toTitleCase(input: string, forceWords?: string|string[]): string {

FILE: projects/ajsf-core/src/lib/shared/validator.functions.ts
  type SchemaPrimitiveType (line 34) | type SchemaPrimitiveType =
  type SchemaType (line 36) | type SchemaType =
  type JavaScriptPrimitiveType (line 38) | type JavaScriptPrimitiveType =
  type JavaScriptType (line 40) | type JavaScriptType =
  type PrimitiveValue (line 44) | type PrimitiveValue = string | number | boolean | null | undefined;
  type PlainObject (line 45) | interface PlainObject { [k: string]: any; }
  type IValidatorFn (line 47) | type IValidatorFn = (c: AbstractControl, i?: boolean) => PlainObject;
  type AsyncIValidatorFn (line 48) | type AsyncIValidatorFn = (c: AbstractControl, i?: boolean) => any;
  function _executeValidators (line 62) | function _executeValidators(control, validators, invert = false) {
  function _executeAsyncValidators (line 78) | function _executeAsyncValidators(control, validators, invert = false) {
  function _mergeObjects (line 92) | function _mergeObjects(...objects) {
  function _mergeErrors (line 120) | function _mergeErrors(arrayOfErrors) {
  function isDefined (line 134) | function isDefined(value) {
  function hasValue (line 150) | function hasValue(value) {
  function isEmpty (line 162) | function isEmpty(value) {
  function isString (line 176) | function isString(value) {
  function isNumber (line 189) | function isNumber(value, strict: any = false) {
  function isInteger (line 203) | function isInteger(value, strict: any = false) {
  function isBoolean (line 218) | function isBoolean(value, option: any = null) {
  function isFunction (line 230) | function isFunction(item: any): boolean {
  function isObject (line 234) | function isObject(item: any): boolean {
  function isArray (line 238) | function isArray(item: any): boolean {
  function isDate (line 242) | function isDate(item: any): boolean {
  function isMap (line 246) | function isMap(item: any): boolean {
  function isSet (line 250) | function isSet(item: any): boolean {
  function isSymbol (line 254) | function isSymbol(item: any): boolean {
  function getType (line 292) | function getType(value, strict: any = false) {
  function isType (line 313) | function isType(value, type) {
  function isPrimitive (line 340) | function isPrimitive(value) {
  function toJavaScriptType (line 391) | function toJavaScriptType(value, types, strictIntegers = true)  {
  function toSchemaType (line 465) | function toSchemaType(value, types) {
  function isPromise (line 530) | function isPromise(object): object is Promise<any> {
  function isObservable (line 540) | function isObservable(object): object is Observable<any> {
  function _toPromise (line 550) | function _toPromise(object): Promise<any> {
  function toObservable (line 560) | function toObservable(object): Observable<any> {
  function inArray (line 583) | function inArray(item, array, allIn = false) {
  function xor (line 599) | function xor(value1, value2) {

FILE: projects/ajsf-core/src/lib/widget-library/add-reference.component.ts
  class AddReferenceComponent (line 23) | class AddReferenceComponent implements OnInit {
    method constructor (line 32) | constructor(
    method ngOnInit (line 36) | ngOnInit() {
    method showAddButton (line 40) | get showAddButton(): boolean {
    method addItem (line 45) | addItem(event) {
    method buttonText (line 50) | get buttonText(): string {

FILE: projects/ajsf-core/src/lib/widget-library/button.component.ts
  class ButtonComponent (line 27) | class ButtonComponent implements OnInit {
    method constructor (line 38) | constructor(
    method ngOnInit (line 42) | ngOnInit() {
    method updateValue (line 47) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/checkbox.component.ts
  class CheckboxComponent (line 41) | class CheckboxComponent implements OnInit {
    method constructor (line 54) | constructor(
    method ngOnInit (line 58) | ngOnInit() {
    method updateValue (line 66) | updateValue(event) {
    method isChecked (line 71) | get isChecked() {

FILE: projects/ajsf-core/src/lib/widget-library/checkboxes.component.ts
  class CheckboxesComponent (line 60) | class CheckboxesComponent implements OnInit {
    method constructor (line 74) | constructor(
    method ngOnInit (line 78) | ngOnInit() {
    method updateValue (line 94) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/file.component.ts
  class FileComponent (line 13) | class FileComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 28) | ngOnInit() {
    method updateValue (line 33) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/hidden.component.ts
  class HiddenComponent (line 22) | class HiddenComponent implements OnInit {
    method constructor (line 32) | constructor(
    method ngOnInit (line 36) | ngOnInit() {

FILE: projects/ajsf-core/src/lib/widget-library/index.ts
  constant BASIC_WIDGETS (line 24) | const BASIC_WIDGETS = [

FILE: projects/ajsf-core/src/lib/widget-library/input.component.ts
  class InputComponent (line 52) | class InputComponent implements OnInit {
    method constructor (line 64) | constructor(
    method ngOnInit (line 68) | ngOnInit() {
    method updateValue (line 73) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/message.component.ts
  class MessageComponent (line 13) | class MessageComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 24) | ngOnInit() {

FILE: projects/ajsf-core/src/lib/widget-library/none.component.ts
  class NoneComponent (line 8) | class NoneComponent {

FILE: projects/ajsf-core/src/lib/widget-library/number.component.ts
  class NumberComponent (line 51) | class NumberComponent implements OnInit {
    method constructor (line 66) | constructor(
    method ngOnInit (line 70) | ngOnInit() {
    method updateValue (line 76) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/one-of.component.ts
  class OneOfComponent (line 13) | class OneOfComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 28) | ngOnInit() {
    method updateValue (line 33) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/orderable.directive.ts
  class OrderableDirective (line 36) | class OrderableDirective implements OnInit {
    method constructor (line 46) | constructor(
    method ngOnInit (line 52) | ngOnInit() {

FILE: projects/ajsf-core/src/lib/widget-library/radios.component.ts
  class RadiosComponent (line 67) | class RadiosComponent implements OnInit {
    method constructor (line 80) | constructor(
    method ngOnInit (line 84) | ngOnInit() {
    method updateValue (line 98) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/root.component.ts
  class RootComponent (line 50) | class RootComponent {
    method constructor (line 58) | constructor(
    method isDraggable (line 62) | isDraggable(node: any): boolean {
    method getFlexAttribute (line 69) | getFlexAttribute(node: any, attribute: string) {
    method showWidget (line 75) | showWidget(layoutNode: any): boolean {

FILE: projects/ajsf-core/src/lib/widget-library/section.component.ts
  class SectionComponent (line 76) | class SectionComponent implements OnInit {
    method constructor (line 84) | constructor(
    method sectionTitle (line 88) | get sectionTitle() {
    method ngOnInit (line 92) | ngOnInit() {
    method toggleExpanded (line 108) | toggleExpanded() {
    method getFlexAttribute (line 114) | getFlexAttribute(attribute: string) {

FILE: projects/ajsf-core/src/lib/widget-library/select-framework.component.ts
  class SelectFrameworkComponent (line 13) | class SelectFrameworkComponent implements OnChanges, OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 28) | ngOnInit() {
    method ngOnChanges (line 32) | ngOnChanges() {
    method updateComponent (line 36) | updateComponent() {

FILE: projects/ajsf-core/src/lib/widget-library/select-widget.component.ts
  class SelectWidgetComponent (line 13) | class SelectWidgetComponent implements OnChanges, OnInit {
    method constructor (line 21) | constructor(
    method ngOnInit (line 26) | ngOnInit() {
    method ngOnChanges (line 30) | ngOnChanges() {
    method updateComponent (line 34) | updateComponent() {

FILE: projects/ajsf-core/src/lib/widget-library/select.component.ts
  class SelectComponent (line 67) | class SelectComponent implements OnInit {
    method constructor (line 80) | constructor(
    method ngOnInit (line 84) | ngOnInit() {
    method updateValue (line 93) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/submit.component.ts
  class SubmitComponent (line 26) | class SubmitComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 41) | ngOnInit() {
    method updateValue (line 55) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/tab.component.ts
  class TabComponent (line 16) | class TabComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 26) | ngOnInit() {

FILE: projects/ajsf-core/src/lib/widget-library/tabs.component.ts
  class TabsComponent (line 39) | class TabsComponent implements OnInit {
    method constructor (line 48) | constructor(
    method ngOnInit (line 52) | ngOnInit() {
    method select (line 58) | select(index) {
    method updateControl (line 71) | updateControl() {
    method setTabTitle (line 80) | setTabTitle(item: any, index: number): string {

FILE: projects/ajsf-core/src/lib/widget-library/template.component.ts
  class TemplateComponent (line 19) | class TemplateComponent implements OnInit, OnChanges {
    method constructor (line 27) | constructor(
    method ngOnInit (line 32) | ngOnInit() {
    method ngOnChanges (line 36) | ngOnChanges() {
    method updateComponent (line 40) | updateComponent() {

FILE: projects/ajsf-core/src/lib/widget-library/textarea.component.ts
  class TextareaComponent (line 45) | class TextareaComponent implements OnInit {
    method constructor (line 56) | constructor(
    method ngOnInit (line 60) | ngOnInit() {
    method updateValue (line 65) | updateValue(event) {

FILE: projects/ajsf-core/src/lib/widget-library/widget-library.module.ts
  class WidgetLibraryModule (line 12) | class WidgetLibraryModule {

FILE: projects/ajsf-core/src/lib/widget-library/widget-library.service.ts
  class WidgetLibraryService (line 27) | class WidgetLibraryService {
    method constructor (line 144) | constructor() {
    method setActiveWidgets (line 148) | setActiveWidgets(): boolean {
    method setDefaultWidget (line 169) | setDefaultWidget(type: string): boolean {
    method hasWidget (line 175) | hasWidget(type: string, widgetSet = 'activeWidgets'): boolean {
    method hasDefaultWidget (line 180) | hasDefaultWidget(type: string): boolean {
    method registerWidget (line 184) | registerWidget(type: string, widget: any): boolean {
    method unRegisterWidget (line 190) | unRegisterWidget(type: string): boolean {
    method unRegisterAllWidgets (line 196) | unRegisterAllWidgets(unRegisterFrameworkWidgets = true): boolean {
    method registerFrameworkWidgets (line 202) | registerFrameworkWidgets(widgets: any): boolean {
    method unRegisterFrameworkWidgets (line 208) | unRegisterFrameworkWidgets(): boolean {
    method getWidget (line 216) | getWidget(type?: string, widgetSet = 'activeWidgets'): any {
    method getAllWidgets (line 226) | getAllWidgets(): any {

FILE: projects/ajsf-material/src/lib/angular-flex-monkey-patch.ts
  function fixAngularFlex (line 3) | function fixAngularFlex() {

FILE: projects/ajsf-material/src/lib/material-design-framework.component.ts
  class MaterialDesignFrameworkComponent (line 11) | class MaterialDesignFrameworkComponent implements OnInit, OnChanges {
    method constructor (line 25) | constructor(
    method showRemoveButton (line 31) | get showRemoveButton(): boolean {
    method ngOnInit (line 51) | ngOnInit() {
    method ngOnChanges (line 55) | ngOnChanges() {
    method initializeFramework (line 64) | initializeFramework() {
    method updateTitle (line 109) | updateTitle() {
    method removeItem (line 118) | removeItem() {

FILE: projects/ajsf-material/src/lib/material-design-framework.module.ts
  constant ANGULAR_MATERIAL_MODULES (line 44) | const ANGULAR_MATERIAL_MODULES = [
  class MaterialDesignFrameworkModule (line 77) | class MaterialDesignFrameworkModule {
    method constructor (line 78) | constructor() {

FILE: projects/ajsf-material/src/lib/material-design.framework.ts
  class MaterialDesignFramework (line 31) | class MaterialDesignFramework extends Framework {

FILE: projects/ajsf-material/src/lib/widgets/flex-layout-root.component.ts
  class FlexLayoutRootComponent (line 27) | class FlexLayoutRootComponent {
    method constructor (line 33) | constructor(
    method removeItem (line 37) | removeItem(item) {
    method getFlexAttribute (line 43) | getFlexAttribute(node: any, attribute: string) {
    method showWidget (line 49) | showWidget(layoutNode: any): boolean {

FILE: projects/ajsf-material/src/lib/widgets/flex-layout-section.component.ts
  class FlexLayoutSectionComponent (line 145) | class FlexLayoutSectionComponent implements OnInit {
    method constructor (line 158) | constructor(
    method sectionTitle (line 162) | get sectionTitle() {
    method ngOnInit (line 166) | ngOnInit() {
    method toggleExpanded (line 187) | toggleExpanded() {
    method getFlexAttribute (line 193) | getFlexAttribute(attribute: string) {

FILE: projects/ajsf-material/src/lib/widgets/material-add-reference.component.ts
  class MaterialAddReferenceComponent (line 20) | class MaterialAddReferenceComponent implements OnInit {
    method constructor (line 29) | constructor(
    method ngOnInit (line 33) | ngOnInit() {
    method showAddButton (line 37) | get showAddButton(): boolean {
    method addItem (line 42) | addItem(event) {
    method buttonText (line 47) | get buttonText(): string {

FILE: projects/ajsf-material/src/lib/widgets/material-button-group.component.ts
  class MaterialButtonGroupComponent (line 38) | class MaterialButtonGroupComponent implements OnInit {
    method constructor (line 51) | constructor(
    method ngOnInit (line 55) | ngOnInit() {
    method updateValue (line 64) | updateValue(value) {

FILE: projects/ajsf-material/src/lib/widgets/material-button.component.ts
  class MaterialButtonComponent (line 26) | class MaterialButtonComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 41) | ngOnInit() {
    method updateValue (line 52) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-checkbox.component.ts
  class MaterialCheckboxComponent (line 72) | class MaterialCheckboxComponent implements OnInit {
    method constructor (line 86) | constructor(
    method ngOnInit (line 90) | ngOnInit() {
    method updateValue (line 104) | updateValue(event) {
    method isChecked (line 109) | get isChecked() {

FILE: projects/ajsf-material/src/lib/widgets/material-checkboxes.component.ts
  class MaterialCheckboxesComponent (line 54) | class MaterialCheckboxesComponent implements OnInit {
    method constructor (line 68) | constructor(
    method ngOnInit (line 72) | ngOnInit() {
    method allChecked (line 88) | get allChecked(): boolean {
    method someChecked (line 92) | get someChecked(): boolean {
    method updateValue (line 97) | updateValue() {
    method updateAllValues (line 104) | updateAllValues(event: any) {

FILE: projects/ajsf-material/src/lib/widgets/material-chip-list.component.ts
  class MaterialChipListComponent (line 12) | class MaterialChipListComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 27) | ngOnInit() {
    method updateValue (line 32) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-datepicker.component.ts
  class MaterialDatepickerComponent (line 65) | class MaterialDatepickerComponent implements OnInit {
    method constructor (line 77) | constructor(
    method ngOnInit (line 82) | ngOnInit() {

FILE: projects/ajsf-material/src/lib/widgets/material-file.component.ts
  class MaterialFileComponent (line 12) | class MaterialFileComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 27) | ngOnInit() {
    method updateValue (line 32) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-input.component.ts
  class MaterialInputComponent (line 67) | class MaterialInputComponent implements OnInit {
    method constructor (line 80) | constructor(
    method ngOnInit (line 86) | ngOnInit() {
    method updateValue (line 94) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-number.component.ts
  class MaterialNumberComponent (line 63) | class MaterialNumberComponent implements OnInit {
    method constructor (line 78) | constructor(
    method ngOnInit (line 83) | ngOnInit() {
    method updateValue (line 92) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-one-of.component.ts
  class MaterialOneOfComponent (line 12) | class MaterialOneOfComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 27) | ngOnInit() {
    method updateValue (line 32) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-radios.component.ts
  class MaterialRadiosComponent (line 56) | class MaterialRadiosComponent implements OnInit {
    method constructor (line 69) | constructor(
    method ngOnInit (line 73) | ngOnInit() {
    method updateValue (line 85) | updateValue(value) {

FILE: projects/ajsf-material/src/lib/widgets/material-select.component.ts
  class MaterialSelectComponent (line 84) | class MaterialSelectComponent implements OnInit {
    method constructor (line 97) | constructor(
    method ngOnInit (line 102) | ngOnInit() {
    method updateValue (line 114) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-slider.component.ts
  class MaterialSliderComponent (line 33) | class MaterialSliderComponent implements OnInit {
    method constructor (line 48) | constructor(
    method ngOnInit (line 52) | ngOnInit() {
    method updateValue (line 57) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-stepper.component.ts
  class MaterialStepperComponent (line 12) | class MaterialStepperComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 27) | ngOnInit() {
    method updateValue (line 32) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/material-tabs.component.ts
  class MaterialTabsComponent (line 28) | class MaterialTabsComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 41) | ngOnInit() {
    method select (line 47) | select(index) {
    method updateControl (line 59) | updateControl() {
    method setTabTitle (line 66) | setTabTitle(item: any, index: number): string {

FILE: projects/ajsf-material/src/lib/widgets/material-textarea.component.ts
  class MaterialTextareaComponent (line 61) | class MaterialTextareaComponent implements OnInit {
    method constructor (line 72) | constructor(
    method ngOnInit (line 77) | ngOnInit() {
    method updateValue (line 85) | updateValue(event) {

FILE: projects/ajsf-material/src/lib/widgets/public_api.ts
  constant MATERIAL_FRAMEWORK_COMPONENTS (line 23) | const MATERIAL_FRAMEWORK_COMPONENTS = [
Condensed preview — 261 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (772K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 375,
    "preview": "# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers\n# For additional inf"
  },
  {
    "path": ".editorconfig",
    "chars": 245,
    "preview": "# Editor configuration, see http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1089,
    "preview": "name: CI\n\non:\n  workflow_dispatch:\n    inputs:\n      logLevel:\n        description: 'Log level'\n        required: true\n "
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1714,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [main, angular6-json-schema-form]\n  pull_request:\n    # The branches below mus"
  },
  {
    "path": ".github/workflows/dependabot.yml",
    "chars": 1242,
    "preview": "version: 2\nupdates:\n  # npm dependencies\n  - package-ecosystem: \"npm\"\n    # package.json directory\n    directory: \"/\"\n  "
  },
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 427,
    "preview": "name: Deploy\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: act"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 404,
    "preview": "name: Mark stale issues and pull requests\n\non:\n  schedule:\n  - cron: \"0 0 * * *\"\n\njobs:\n  stale:\n\n    runs-on: ubuntu-la"
  },
  {
    "path": ".gitignore",
    "chars": 519,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/tmp\n/out-tsc\n\n# depe"
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "16.13.2\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6051,
    "preview": "# Contributing to ajsf\n\najsf is an open project and welcomes contributions. These guidelines are provided to help you un"
  },
  {
    "path": "LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2018 Hamza Hamidi\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "README.md",
    "chars": 25334,
    "preview": "# AJSF (Angular JSON Schema Form)\n\n**N.B:** For Angular6-json-schema-form please check [this documentation](https://gith"
  },
  {
    "path": "angular.json",
    "chars": 7182,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \""
  },
  {
    "path": "demo/app/ace-editor.directive.ts",
    "chars": 2179,
    "preview": "import { Directive, ElementRef, EventEmitter, Input, Output } from '@angular/core';\nimport ace from 'brace';\nimport 'bra"
  },
  {
    "path": "demo/app/demo-root.component.ts",
    "chars": 215,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  // tslint:disable-next-line:component-selector\n  selector: 'd"
  },
  {
    "path": "demo/app/demo.component.html",
    "chars": 7660,
    "preview": "<div class=\"demo-page-header\">\n  <mat-toolbar class=\"mat-elevation-z4 mat-medium\" color=\"primary\">\n    Angular JSON Sche"
  },
  {
    "path": "demo/app/demo.component.ts",
    "chars": 8110,
    "preview": "import { Component, OnInit, ViewChild } from '@angular/core';\nimport { MatMenuTrigger } from '@angular/material/menu';\ni"
  },
  {
    "path": "demo/app/demo.module.ts",
    "chars": 1831,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAni"
  },
  {
    "path": "demo/app/demo.routes.ts",
    "chars": 214,
    "preview": "import { Route } from '@angular/router';\n\nimport { DemoComponent } from './demo.component';\n\nexport const routes: Route["
  },
  {
    "path": "demo/app/example-schemas.model.ts",
    "chars": 10510,
    "preview": "/**\n * Sources:\n *\n * Angular JSON Schema Form examples ('ng-jsf-...') are original\n *\n * JSON Meta-Schemas ('json-schem"
  },
  {
    "path": "demo/assets/example-schemas/asf-array.json",
    "chars": 1616,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Comment\",\n    \"type\": \"object\",\n    \"required\": [ \"comments\" ],\n    \"properties\": {\n      "
  },
  {
    "path": "demo/assets/example-schemas/asf-basic-json-schema-type.json",
    "chars": 367,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Types\",\n    \"properties\": {\n      \"string\": {\n        \"type\": \"strin"
  },
  {
    "path": "demo/assets/example-schemas/asf-bootstrap-grid.json",
    "chars": 1243,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Comment\",\n    \"properties\": {\n      \"name\": {\n        \"title\": \"Name"
  },
  {
    "path": "demo/assets/example-schemas/asf-complex-key-support.json",
    "chars": 1129,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Complex Key Support\",\n    \"properties\": {\n      \"a[\\\"b\\\"].c\": { \"typ"
  },
  {
    "path": "demo/assets/example-schemas/asf-hack-conditional-required.json",
    "chars": 870,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"switch\": {\n        \"title\": \"Spam me, please\",\n        "
  },
  {
    "path": "demo/assets/example-schemas/asf-kitchen-sink.json",
    "chars": 5583,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"required\": [ \"name\", \"shoesizeLeft\" ],\n    \"properties\": {\n      \"name\": {\n  "
  },
  {
    "path": "demo/assets/example-schemas/asf-simple.json",
    "chars": 785,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Comment\",\n    \"properties\": {\n      \"name\": {\n        \"title\": \"Name"
  },
  {
    "path": "demo/assets/example-schemas/asf-tab-array.json",
    "chars": 1329,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Comment\",\n    \"properties\": {\n      \"comments\": {\n        \"type\": \"a"
  },
  {
    "path": "demo/assets/example-schemas/asf-titlemap-examples.json",
    "chars": 2114,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"select\": {\n        \"title\": \"Select without titleMap\",\n"
  },
  {
    "path": "demo/assets/example-schemas/jsf-events.json",
    "chars": 384,
    "preview": "{\n  \"schema\": {\n    \"text\": {\n      \"type\": \"string\",\n      \"title\": \"Text\"\n    }\n  },\n  \"form\": [ {\n    \"key\": \"text\",\n"
  },
  {
    "path": "demo/assets/example-schemas/jsf-factory-sleek.json",
    "chars": 1646,
    "preview": "{\n  \"schema\": {\n    \"color\": {\n      \"title\": \"Color\",\n      \"type\": \"string\",\n      \"enum\": [ \"blue\", \"spicy\", \"gray\", "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-ace.json",
    "chars": 246,
    "preview": "{\n  \"schema\": {\n    \"code\": {\n      \"type\": \"string\",\n      \"title\": \"Some JSON\"\n    }\n  },\n  \"form\": [ {\n    \"key\": \"co"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-actions.json",
    "chars": 304,
    "preview": "{\n  \"schema\": {\n    \"search\": {\n      \"type\": \"string\",\n      \"title\": \"Search\"\n    }\n  },\n  \"form\": [\n    \"search\",\n   "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-advancedfieldset.json",
    "chars": 267,
    "preview": "{\n  \"schema\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"title\": \"Name\"\n    },\n    \"age\": {\n      \"type\": \"number\",\n"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-array-simple.json",
    "chars": 698,
    "preview": "{\n  \"schema\": {\n    \"friends\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"title\": \"Fri"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-array.json",
    "chars": 1306,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"friendsA\": { \"$ref\": \"#/definitions/friends\" },\n      \""
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-authfieldset.json",
    "chars": 269,
    "preview": "{\n  \"schema\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"title\": \"Name\"\n    },\n    \"key\": {\n      \"type\": \"string\",\n"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-autocomplete.json",
    "chars": 893,
    "preview": "{\n  \"schema\": {\n    \"name\": {\n      \"title\": \"Name\",\n      \"type\": \"string\"\n    },\n    \"nick\": {\n      \"title\": \"Nick na"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-checkbox.json",
    "chars": 734,
    "preview": "{\n  \"schema\": {\n    \"properties\": {\n      \"flag\": {\n        \"type\": \"boolean\",\n        \"title\": \"Adult\"\n      },\n      \""
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-checkboxbuttons.json",
    "chars": 420,
    "preview": "{\n  \"schema\": {\n    \"language\": {\n      \"type\": \"array\",\n      \"title\": \"Best language\",\n      \"items\": {\n        \"type\""
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-checkboxes.json",
    "chars": 2108,
    "preview": "{\n  \"schema\": {\n    \"properties\": {\n      \"menu\": {\n        \"type\": \"array\",\n        \"title\": \"Options\",\n        \"items\""
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-color.json",
    "chars": 124,
    "preview": "{\n  \"schema\": {\n    \"maincolor\": {\n      \"type\": \"string\",\n      \"title\": \"Main color\",\n      \"format\": \"color\"\n    }\n  "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-common.json",
    "chars": 659,
    "preview": "{\n  \"schema\": {\n    \"shortmood\": {\n      \"type\": \"string\",\n      \"title\": \"Mood of the day\",\n      \"description\": \"Descr"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-fieldset.json",
    "chars": 417,
    "preview": "{\n  \"schema\": {\n    \"comment\": {\n      \"type\": \"string\",\n      \"title\": \"Comment\"\n    },\n    \"name\": {\n      \"type\": \"st"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-help.json",
    "chars": 511,
    "preview": "{\n  \"schema\": {\n    \"name\": {\n      \"title\": \"Name\",\n      \"description\": \"Nickname allowed\",\n      \"type\": \"string\"\n   "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-hidden.json",
    "chars": 350,
    "preview": "{\n  \"schema\": {\n    \"apikey\": {\n      \"type\": \"string\",\n      \"title\": \"API key\",\n      \"default\": \"supercalifragilistic"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-iconselect.json",
    "chars": 2171,
    "preview": "{\n  \"schema\": {\n    \"icon\": {\n      \"title\": \"Choose an icon\",\n      \"type\": \"string\",\n      \"enum\": [ \"glass\", \"music\","
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-imageselect.json",
    "chars": 606,
    "preview": "{\n  \"schema\": {\n    \"icon\": {\n      \"title\": \"Choose an icon\",\n      \"type\": \"string\",\n      \"enum\": [\n        \"address-"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-password.json",
    "chars": 156,
    "preview": "{\n  \"schema\": {\n    \"pwd\": {\n      \"type\": \"string\",\n      \"title\": \"Your secret\"\n    }\n  },\n  \"form\": [ {\n    \"key\": \"p"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-questions.json",
    "chars": 856,
    "preview": "{\n  \"schema\": {\n    \"response\": {\n      \"type\": \"string\",\n      \"title\": \"Search\"\n    }\n  },\n  \"form\": [ {\n    \"type\": \""
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-radiobuttons.json",
    "chars": 614,
    "preview": "{\n  \"schema\": {\n    \"language\": {\n      \"type\": \"string\",\n      \"title\": \"Best language\",\n      \"enum\": [ \"JavaScript\", "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-radios.json",
    "chars": 921,
    "preview": "{\n  \"schema\": {\n    \"language\": {\n      \"type\": \"string\",\n      \"title\": \"Best language\",\n      \"enum\": [ \"JavaScript\", "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-range.json",
    "chars": 534,
    "preview": "{\n  \"schema\": {\n    \"range\": {\n      \"type\": \"integer\",\n      \"title\": \"Is JSON Form useful?\",\n      \"description\": \"The"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-section.json",
    "chars": 392,
    "preview": "{\n  \"schema\": {\n    \"comment\": {\n      \"type\": \"string\",\n      \"title\": \"Comment\"\n    },\n    \"name\": {\n      \"type\": \"st"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-select.json",
    "chars": 1024,
    "preview": "{\n  \"schema\": {\n    \"gender\": {\n      \"type\": \"string\",\n      \"title\": \"Gender\",\n      \"enum\": [ \"male\", \"female\", \"alie"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-selectfieldset-key.json",
    "chars": 618,
    "preview": "{\n  \"schema\": {\n    \"choice\": {\n      \"type\": \"string\",\n      \"enum\": [ \"text\", \"cat\" ]\n    },\n    \"text\": {\n      \"type"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-selectfieldset.json",
    "chars": 541,
    "preview": "{\n  \"schema\": {\n    \"text\": {\n      \"type\": \"string\",\n      \"title\": \"Text\"\n    },\n    \"category\": {\n      \"type\": \"stri"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-submit.json",
    "chars": 387,
    "preview": "{\n  \"schema\": {\n  \t\"name\": {\n      \"title\": \"Name\",\n      \"description\": \"Nickname allowed\",\n      \"type\": \"string\"\n    "
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-tabarray-maxitems.json",
    "chars": 749,
    "preview": "{\n  \"schema\": {\n    \"friends\": {\n      \"type\": \"array\",\n      \"maxItems\": 3,\n      \"items\": {\n        \"type\": \"object\",\n"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-tabarray-value.json",
    "chars": 394,
    "preview": "{\n  \"schema\": {\n    \"thoughts\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\",\n        \"title\": \"Th"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-tabarray.json",
    "chars": 700,
    "preview": "{\n  \"schema\": {\n  \t\"friends\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"title\": \"Frie"
  },
  {
    "path": "demo/assets/example-schemas/jsf-fields-textarea.json",
    "chars": 166,
    "preview": "{\n  \"schema\": {\n    \"comment\": {\n      \"type\": \"string\",\n      \"title\": \"Your thoughts\"\n    }\n  },\n  \"form\": [ {\n    \"ke"
  },
  {
    "path": "demo/assets/example-schemas/jsf-gettingstarted.json",
    "chars": 183,
    "preview": "{\n  \"schema\": {\n    \"field\": {\n      \"type\": \"string\",\n      \"title\": \"A field\"\n    }\n  },\n  \"form\": [ {\n    \"key\": \"fie"
  },
  {
    "path": "demo/assets/example-schemas/jsf-previousvalues-multidimensional.json",
    "chars": 376,
    "preview": "{\n  \"schema\": {\n    \"reminders\": {\n      \"type\": \"array\",\n      \"title\": \"Reminders\",\n      \"items\": {\n        \"type\": \""
  },
  {
    "path": "demo/assets/example-schemas/jsf-previousvalues.json",
    "chars": 747,
    "preview": "{\n  \"schema\": {\n    \"friends\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"title\": \"Fri"
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-array.json",
    "chars": 540,
    "preview": "{\n  \"schema\": {\n    \"friends\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"title\": \"Fri"
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-basic.json",
    "chars": 281,
    "preview": "{\n  \"schema\": {\n    \"name\": {\n      \"title\": \"Name\",\n      \"description\": \"Nickname allowed\",\n      \"type\": \"string\"\n   "
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-default.json",
    "chars": 1057,
    "preview": "{\n  \"schema\": {\n    \"friends\": {\n      \"type\": \"array\",\n      \"default\": [ \"foo\", \"bar\" ],\n      \"readOnly\": true,\n     "
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-inlineref.json",
    "chars": 619,
    "preview": "{\n  \"schema\": {\n    \"properties\": {\n      \"animal\": { \"$ref\": \"#/definitions/animation\" }\n    },\n    \"definitions\": {\n  "
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-morecomplex.json",
    "chars": 532,
    "preview": "{\n  \"schema\": {\n    \"message\": {\n      \"type\": \"string\",\n      \"title\": \"Message\"\n    },\n    \"author\": {\n      \"type\": \""
  },
  {
    "path": "demo/assets/example-schemas/jsf-schema-required.json",
    "chars": 1557,
    "preview": "{\n  \"schema\": {\n    \"v3customer\": {\n      \"title\": \"Customer\",\n      \"description\": \"json-schema v3 style 'required'\",\n "
  },
  {
    "path": "demo/assets/example-schemas/jsf-templating-idx.json",
    "chars": 283,
    "preview": "{\n  \"schema\": {\n    \"thoughts\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"title\": \"A thought\",\n        \"type\": "
  },
  {
    "path": "demo/assets/example-schemas/jsf-templating-tpldata.json",
    "chars": 215,
    "preview": "{\n  \"schema\": {\n    \"age\": {\n      \"type\": \"integer\",\n      \"title\": \"Age\"\n    }\n  },\n  \"form\": [ {\n    \"key\": \"age\",\n  "
  },
  {
    "path": "demo/assets/example-schemas/jsf-templating-value.json",
    "chars": 461,
    "preview": "{\n  \"schema\": {\n    \"thoughts\": {\n      \"type\": \"array\",\n      \"title\": \"Thoughts\",\n      \"items\": {\n        \"type\": \"st"
  },
  {
    "path": "demo/assets/example-schemas/jsf-templating-values.json",
    "chars": 422,
    "preview": "{\n  \"schema\": {\n    \"firstname\": { \"type\": \"string\", \"title\": \"First name\" },\n    \"lastname\":  { \"type\": \"string\", \"titl"
  },
  {
    "path": "demo/assets/example-schemas/json-schema-draft01.json",
    "chars": 2335,
    "preview": "{\n\t\"$schema\" : \"http://json-schema.org/draft-01/hyper-schema#\",\n\t\"id\" : \"http://json-schema.org/draft-01/schema#\",\n\t\"typ"
  },
  {
    "path": "demo/assets/example-schemas/json-schema-draft02.json",
    "chars": 2558,
    "preview": "{\n\t\"$schema\" : \"http://json-schema.org/draft-02/hyper-schema#\",\n\t\"id\" : \"http://json-schema.org/draft-02/schema#\",\n\t\"typ"
  },
  {
    "path": "demo/assets/example-schemas/json-schema-draft03.json",
    "chars": 2570,
    "preview": "{\n  \"$schema\": \"http://json-schema.org/draft-03/schema#\",\n  \"id\": \"http://json-schema.org/draft-03/schema#\",\n  \"type\": \""
  },
  {
    "path": "demo/assets/example-schemas/json-schema-draft04.json",
    "chars": 3243,
    "preview": "{\n  \"id\": \"http://json-schema.org/draft-04/schema#\",\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"descript"
  },
  {
    "path": "demo/assets/example-schemas/json-schema-draft06.json",
    "chars": 3127,
    "preview": "{\n  \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n  \"$id\": \"http://json-schema.org/draft-06/schema#\",\n  \"title\":"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-data-only.json",
    "chars": 415,
    "preview": "{\n  \"data\": {\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"age\": 25,\n    \"is_company\": false,\n    \"address\": {"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-deep-ref.json",
    "chars": 1554,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"int\": {\n        \"type\": \"number\",\n        \"minimum\": 0,\n        \"maximum\": 1"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-flex-layout.json",
    "chars": 3197,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"first_name\": { \"type\": \"string\" },\n      \"last_name\": {"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-layout-only.json",
    "chars": 662,
    "preview": "{\n  \"layout\": [\n    { \"type\": \"section\", \"title\": \"Name\", \"required\": true,\n      \"items\": [\n        \"first_name\",\n     "
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-nested-arrays.json",
    "chars": 974,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"tiers_obj\": {\n        \"type\": \"object\",\n        \"title\": \"Tier\",\n        \"pr"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-select-list-examples.json",
    "chars": 5278,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Who's your favorite captain?\",\n    \"description\": \"Demonstrates different ways to create s"
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-select-widget-examples.json",
    "chars": 4172,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Select your favorite captain\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"select1\": "
  },
  {
    "path": "demo/assets/example-schemas/ng-jsf-simple-array.json",
    "chars": 309,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"items\": {\n        \"type\": \"array\",\n        \"items\": {\n "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-alternatives.json",
    "chars": 1259,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"Color\": {\n        \"title\": \"Color\",\n        \"type\": \"string\",\n        \"anyOf"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-arrays.json",
    "chars": 3591,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"Thing\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\""
  },
  {
    "path": "demo/assets/example-schemas/rjsf-custom-array.json",
    "chars": 1461,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Custom array of strings\",\n    \"type\": \"array\",\n    \"items\": {\n      \"type\": \"string\"\n    }"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-custom.json",
    "chars": 284,
    "preview": "{\n  \"schema\": {\n    \"title\": \"A localisation form\",\n    \"type\": \"object\",\n    \"required\": [ \"lat\", \"lon\" ],\n    \"propert"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-date-and-time.json",
    "chars": 913,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Date and time widgets\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"native\": {\n      "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-errors.json",
    "chars": 900,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Contextualized errors\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"firstName\": {\n   "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-files.json",
    "chars": 415,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Files\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"file\": {\n        \"type\": \"string\""
  },
  {
    "path": "demo/assets/example-schemas/rjsf-large.json",
    "chars": 2522,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"largeEnum\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"option "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-nested.json",
    "chars": 1418,
    "preview": "{\n  \"schema\": {\n    \"title\": \"A list of tasks\",\n    \"type\": \"object\",\n    \"required\": [ \"title\" ],\n    \"properties\": {\n "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-numbers.json",
    "chars": 1233,
    "preview": "{\n  \"schema\": {\n    \"type\": \"object\",\n    \"title\": \"Number fields & widgets\",\n    \"properties\": {\n      \"number\": {\n    "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-ordering.json",
    "chars": 826,
    "preview": "{\n  \"schema\": {\n    \"title\": \"A registration form\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"password\":  { \"type"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-references.json",
    "chars": 1386,
    "preview": "{\n  \"schema\": {\n    \"definitions\": {\n      \"address\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"str"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-simple.json",
    "chars": 1241,
    "preview": "{\n  \"schema\": {\n    \"title\": \"A registration form\",\n    \"description\": \"A simple form example.\",\n    \"type\": \"object\",\n "
  },
  {
    "path": "demo/assets/example-schemas/rjsf-single.json",
    "chars": 129,
    "preview": "{\n  \"schema\": {\n    \"title\": \"A single-field form\",\n    \"type\": \"string\"\n  },\n  \"formData\": \"initial value\",\n  \"uiSchema"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-validation.json",
    "chars": 1121,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Custom validation\",\n    \"description\" :\n      \"This form defines custom validation rules c"
  },
  {
    "path": "demo/assets/example-schemas/rjsf-widgets.json",
    "chars": 3960,
    "preview": "{\n  \"schema\": {\n    \"title\": \"Widgets\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"stringFormats\": {\n        \"type"
  },
  {
    "path": "demo/assets/example-schemas/sources.md",
    "chars": 648,
    "preview": "Sources:\n\n* ng-jsf-...json files are new examples created for angular json schema form\n\n* json-schema-draft...json files"
  },
  {
    "path": "demo/environments/environment.prod.ts",
    "chars": 49,
    "preview": "export const environment = { production: true };\n"
  },
  {
    "path": "demo/environments/environment.ts",
    "chars": 50,
    "preview": "export const environment = { production: false };\n"
  },
  {
    "path": "demo/index.html",
    "chars": 546,
    "preview": "<!doctype html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Angular JSON Schema Form—Demonstration Playground<"
  },
  {
    "path": "demo/karma.conf.js",
    "chars": 1192,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "demo/main.ts",
    "chars": 337,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "demo/polyfills.ts",
    "chars": 2213,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "demo/styles.scss",
    "chars": 1805,
    "preview": "// * { border: 1px solid red !important; }\n@use '@angular/material' as mat;\n@include mat.core();\n$demo-app-primary: mat."
  },
  {
    "path": "demo/test.ts",
    "chars": 1128,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/"
  },
  {
    "path": "demo/tsconfig.app.json",
    "chars": 204,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/app\",\n    \"types\": []\n  },\n  \"files\""
  },
  {
    "path": "demo/tsconfig.spec.json",
    "chars": 256,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/spec\",\n    \"types\": [\n      \"jasmine"
  },
  {
    "path": "demo/tslint.json",
    "chars": 314,
    "preview": "{\n    \"extends\": \"../tslint.json\",\n    \"rules\": {\n        \"directive-selector\": [\n            true,\n            \"attribu"
  },
  {
    "path": "docs/issue_template.md",
    "chars": 1207,
    "preview": "**Describe the bug**\nwhich template:\n\n* [ ] MaterialDesignFrameworkModule — Material Design\n* [ ] Bootstrap3FrameworkMod"
  },
  {
    "path": "e2e/protractor.conf.js",
    "chars": 752,
    "preview": "// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/blob/master/lib"
  },
  {
    "path": "e2e/src/app.e2e-spec.ts",
    "chars": 310,
    "preview": "import { AppPage } from './app.po';\n\ndescribe('workspace-project App', () => {\n  let page: AppPage;\n\n  beforeEach(() => "
  },
  {
    "path": "e2e/src/app.po.ts",
    "chars": 318,
    "preview": "import { browser, by, element } from 'protractor';\nimport { promise as wdpromise } from 'selenium-webdriver';\n\nexport cl"
  },
  {
    "path": "e2e/tsconfig.e2e.json",
    "chars": 213,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/app\",\n    \"module\": \"commonjs\",\n    "
  },
  {
    "path": "package.json",
    "chars": 4020,
    "preview": "{\n  \"name\": \"demo\",\n  \"version\": \"15.0.0\",\n  \"author\": \"https://github.com/hamzahamidi/Angular6-json-schema-form/graphs/"
  },
  {
    "path": "projects/ajsf-bootstrap3/README.md",
    "chars": 2359,
    "preview": "# @ajsf/bootstrap3\n\n## Getting started\n\n```shell\nnpm install @ajsf/bootstrap3@latest\n```\n\nWith YARN, run the following:\n"
  },
  {
    "path": "projects/ajsf-bootstrap3/karma.conf.js",
    "chars": 1237,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "projects/ajsf-bootstrap3/ng-package.json",
    "chars": 239,
    "preview": "{\n  \"$schema\": \"../../node_modules/ng-packagr/ng-package.schema.json\",\n  \"dest\": \"../../dist/@ajsf/bootstrap3\",\n  \"lib\":"
  },
  {
    "path": "projects/ajsf-bootstrap3/package.json",
    "chars": 906,
    "preview": "{\n  \"name\": \"@ajsf/bootstrap3\",\n  \"version\": \"0.8.0\",\n  \"description\": \"Angular JSON Schema Form builder using Bootstrap"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.component.html",
    "chars": 2447,
    "preview": "<div\n  [class]=\"options?.htmlClass || ''\"\n  [class.has-feedback]=\"options?.feedback && options?.isInputWidget &&\n       "
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.component.scss",
    "chars": 534,
    "preview": ":host ::ng-deep {\n  .list-group-item .form-control-feedback {\n    top: 40px;\n  }\n\n  .checkbox,\n  .radio {\n    margin-top"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.component.spec.ts",
    "chars": 1137,
    "preview": "import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';\nimport { CommonModule } from '@angular/"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.component.ts",
    "chars": 9481,
    "preview": "import {ChangeDetectorRef, Component, Input, OnChanges, OnInit} from '@angular/core';\nimport cloneDeep from 'lodash/clon"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3-framework.module.ts",
    "chars": 900,
    "preview": "import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n  Framework,\n  JsonSchema"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/lib/bootstrap3.framework.ts",
    "chars": 774,
    "preview": "import {Injectable} from '@angular/core';\nimport {Framework} from '@ajsf/core';\nimport {Bootstrap3FrameworkComponent} fr"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/public_api.ts",
    "chars": 199,
    "preview": "/*\n * Public API Surface of @ajsf/bootstrap3\n */\n\nexport * from './lib/bootstrap3.framework';\nexport * from './lib/boots"
  },
  {
    "path": "projects/ajsf-bootstrap3/src/test.ts",
    "chars": 697,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js';\nimp"
  },
  {
    "path": "projects/ajsf-bootstrap3/tsconfig.lib.json",
    "chars": 537,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/lib\",\n    \"declarationMap\": tr"
  },
  {
    "path": "projects/ajsf-bootstrap3/tsconfig.lib.prod.json",
    "chars": 162,
    "preview": "{\n  \"extends\": \"./tsconfig.lib.json\",\n  \"compilerOptions\": {\n    \"declarationMap\": false\n  },\n  \"angularCompilerOptions\""
  },
  {
    "path": "projects/ajsf-bootstrap3/tsconfig.spec.json",
    "chars": 246,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/spec\",\n    \"types\": [\n      \"j"
  },
  {
    "path": "projects/ajsf-bootstrap3/tslint.json",
    "chars": 151,
    "preview": "{\n  \"extends\": \"../../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [\n      true,\n      \"attribute\",\n      \"lib\","
  },
  {
    "path": "projects/ajsf-bootstrap4/README.md",
    "chars": 2187,
    "preview": "# @ajsf/bootstrap4\n\n## Getting started\n\n```shell\nnpm install @ajsf/bootstrap4@latest\n```\n\nWith YARN, run the following:\n"
  },
  {
    "path": "projects/ajsf-bootstrap4/karma.conf.js",
    "chars": 1210,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "projects/ajsf-bootstrap4/ng-package.json",
    "chars": 239,
    "preview": "{\n  \"$schema\": \"../../node_modules/ng-packagr/ng-package.schema.json\",\n  \"dest\": \"../../dist/@ajsf/bootstrap4\",\n  \"lib\":"
  },
  {
    "path": "projects/ajsf-bootstrap4/package.json",
    "chars": 906,
    "preview": "{\n  \"name\": \"@ajsf/bootstrap4\",\n  \"version\": \"0.8.0\",\n  \"description\": \"Angular JSON Schema Form builder using Bootstrap"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.component.html",
    "chars": 2447,
    "preview": "<div\n  [class]=\"options?.htmlClass || ''\"\n  [class.has-feedback]=\"options?.feedback && options?.isInputWidget &&\n       "
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.component.scss",
    "chars": 533,
    "preview": ":host ::ng-deep {\n  .list-group-item .form-control-feedback {\n    top: 40px;\n  }\n\n  .checkbox,\n  .radio {\n    margin-top"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.component.spec.ts",
    "chars": 1130,
    "preview": "import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';\nimport { CommonModule } from '@angular/"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.component.ts",
    "chars": 9431,
    "preview": "import {\n  ChangeDetectorRef,\n  Component,\n  Input,\n  OnChanges,\n  OnInit\n} from '@angular/core';\nimport cloneDeep from "
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4-framework.module.ts",
    "chars": 900,
    "preview": "import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n  Framework,\n  JsonSchema"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/lib/bootstrap4.framework.ts",
    "chars": 686,
    "preview": "import {Injectable} from '@angular/core';\nimport {Framework} from '@ajsf/core';\nimport {Bootstrap4FrameworkComponent} fr"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/public_api.ts",
    "chars": 199,
    "preview": "/*\n * Public API Surface of @ajsf/bootstrap4\n */\n\nexport * from './lib/bootstrap4-framework.module';\nexport * from './li"
  },
  {
    "path": "projects/ajsf-bootstrap4/src/test.ts",
    "chars": 697,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js';\nimp"
  },
  {
    "path": "projects/ajsf-bootstrap4/tsconfig.lib.json",
    "chars": 537,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/lib\",\n    \"declarationMap\": tr"
  },
  {
    "path": "projects/ajsf-bootstrap4/tsconfig.lib.prod.json",
    "chars": 162,
    "preview": "{\n  \"extends\": \"./tsconfig.lib.json\",\n  \"compilerOptions\": {\n    \"declarationMap\": false\n  },\n  \"angularCompilerOptions\""
  },
  {
    "path": "projects/ajsf-bootstrap4/tsconfig.spec.json",
    "chars": 246,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/spec\",\n    \"types\": [\n      \"j"
  },
  {
    "path": "projects/ajsf-bootstrap4/tslint.json",
    "chars": 151,
    "preview": "{\n  \"extends\": \"../../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [\n      true,\n      \"attribute\",\n      \"lib\","
  },
  {
    "path": "projects/ajsf-core/karma.conf.js",
    "chars": 1205,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "projects/ajsf-core/ng-package.json",
    "chars": 226,
    "preview": "{\n  \"$schema\": \"../../node_modules/ng-packagr/ng-package.schema.json\",\n  \"dest\": \"../../dist/@ajsf/core\",\n  \"lib\": {\n   "
  },
  {
    "path": "projects/ajsf-core/package.json",
    "chars": 943,
    "preview": "{\n  \"name\": \"@ajsf/core\",\n  \"version\": \"0.8.0\",\n  \"description\": \"Angular JSON Schema Form builder core\",\n  \"author\": \"h"
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/framework-library.service.ts",
    "chars": 2679,
    "preview": "import { Framework } from './framework';\nimport { hasOwn } from '../shared/utility.functions';\nimport { Inject, Injectab"
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/framework.ts",
    "chars": 219,
    "preview": "import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class Framework {\n  name: string;\n  framework: any;\n  "
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/no-framework.component.html",
    "chars": 124,
    "preview": "<select-widget-widget [dataIndex]=\"dataIndex\" [layoutIndex]=\"layoutIndex\" [layoutNode]=\"layoutNode\">\n</select-widget-wid"
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/no-framework.component.ts",
    "chars": 275,
    "preview": "import { Component, Input } from '@angular/core';\n\n@Component({\n  selector: 'no-framework',\n  templateUrl: './no-framewo"
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/no-framework.module.ts",
    "chars": 661,
    "preview": "import { CommonModule } from '@angular/common';\nimport { Framework } from './framework';\nimport { NgModule } from '@angu"
  },
  {
    "path": "projects/ajsf-core/src/lib/framework-library/no.framework.ts",
    "chars": 343,
    "preview": "import { Injectable } from '@angular/core';\nimport { Framework } from './framework';\nimport { NoFrameworkComponent } fro"
  },
  {
    "path": "projects/ajsf-core/src/lib/json-schema-form.component.html",
    "chars": 280,
    "preview": "<form [autocomplete]=\"jsf?.formOptions?.autocomplete ? 'on' : 'off'\" class=\"json-schema-form\" (ngSubmit)=\"submitForm()\">"
  },
  {
    "path": "projects/ajsf-core/src/lib/json-schema-form.component.ts",
    "chars": 30125,
    "preview": "import cloneDeep from 'lodash/cloneDeep';\nimport isEqual from 'lodash/isEqual';\n\nimport {\n  ChangeDetectionStrategy,\n  C"
  },
  {
    "path": "projects/ajsf-core/src/lib/json-schema-form.module.ts",
    "chars": 652,
    "preview": "import { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimpor"
  },
  {
    "path": "projects/ajsf-core/src/lib/json-schema-form.service.ts",
    "chars": 29366,
    "preview": "import { Injectable } from '@angular/core';\nimport { AbstractControl, UntypedFormArray, UntypedFormGroup } from '@angula"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/de-validation-messages.ts",
    "chars": 3057,
    "preview": "export const deValidationMessages: any = { // Default German error messages\n  required: 'Darf nicht leer sein',\n  minLen"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/en-validation-messages.ts",
    "chars": 2944,
    "preview": "export const enValidationMessages: any = { // Default English error messages\n  required: 'This field is required.',\n  mi"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/es-validation-messages.ts",
    "chars": 2841,
    "preview": "export const esValidationMessages: any = { // Default Spanish error messages\n  required: 'Este campo está requerido.',\n "
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/fr-validation-messages.ts",
    "chars": 2984,
    "preview": "export const frValidationMessages: any = { // French error messages\n  required: 'Est obligatoire.',\n  minLength: 'Doit a"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/index.ts",
    "chars": 455,
    "preview": "export { deValidationMessages } from './de-validation-messages';\nexport { enValidationMessages } from './en-validation-m"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/it-validation-messages.ts",
    "chars": 3096,
    "preview": "export const itValidationMessages: any = { // Default Italian error messages\n  required: 'Il campo è obbligatorio',\n  mi"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/pt-validation-messages.ts",
    "chars": 3191,
    "preview": "export const ptValidationMessages: any = { // Brazilian Portuguese error messages\n  required: 'Este campo é obrigatório."
  },
  {
    "path": "projects/ajsf-core/src/lib/locale/zh-validation-messages.ts",
    "chars": 2516,
    "preview": "export const zhValidationMessages: any = { // Chinese error messages\n  required: '必填字段.',\n  minLength: '字符长度必须大于或者等于 {{m"
  },
  {
    "path": "projects/ajsf-core/src/lib/locale-dates/en-US.ts",
    "chars": 447,
    "preview": "export const longMonths = ['January', 'February', 'March', 'April', 'May', 'June',\n    'July', 'August', 'September', 'O"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/convert-schema-to-draft6.function.ts",
    "chars": 12504,
    "preview": "import cloneDeep from 'lodash/cloneDeep';\n\n/**\n * 'convertSchemaToDraft6' function\n *\n * Converts a JSON Schema from dra"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/form-group.functions.ts",
    "chars": 19963,
    "preview": "import cloneDeep from 'lodash/cloneDeep';\nimport filter from 'lodash/filter';\nimport map from 'lodash/map';\nimport {\n  A"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/format-regex.constants.ts",
    "chars": 6849,
    "preview": "// updated from AJV fast format regular expressions:\n// https://github.com/epoberezkin/ajv/blob/master/lib/compile/forma"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/index.ts",
    "chars": 1658,
    "preview": "// Warning: Changing the following order may cause errors if the new order\n// causes a library to be imported before ano"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/json-schema.functions.ts",
    "chars": 28387,
    "preview": "import cloneDeep from 'lodash/cloneDeep';\nimport { forEach, hasOwn, mergeFilteredObject } from './utility.functions';\nim"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/json.validators.ts",
    "chars": 35666,
    "preview": "import isEqual from 'lodash/isEqual';\nimport {\n  _executeAsyncValidators,\n  _executeValidators,\n  _mergeErrors,\n  _merge"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/jsonpointer.functions.ts",
    "chars": 38426,
    "preview": "import {\n  cleanValueOfQuotes,\n  copy,\n  ExpressionType,\n  getExpressionType,\n  getKeyAndValueByExpressionType,\n  hasOwn"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/jspointer.functions.json.spec.ts",
    "chars": 3683,
    "preview": "import {JsonPointer} from './jsonpointer.functions';\n\nconst subObjectWithEvaluatedProperty = {name: 'abc', other_propert"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/layout.functions.ts",
    "chars": 41774,
    "preview": "import uniqueId from 'lodash/uniqueId';\nimport cloneDeep from 'lodash/cloneDeep';\nimport {\n  checkInlineType,\n  getFromS"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/merge-schemas.function.ts",
    "chars": 14962,
    "preview": "import isEqual from 'lodash/isEqual';\n\nimport {\n  isArray, isEmpty, isNumber, isObject, isString\n} from './validator.fun"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/utility.functions.ts",
    "chars": 12674,
    "preview": "import {hasValue, inArray, isArray, isDefined, isEmpty, isMap, isObject, isSet, isString, PlainObject} from './validator"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/validator.functions.spec.ts",
    "chars": 2207,
    "preview": "import {\n  toIsoString,\n  toJavaScriptType,\n  toSchemaType,\n} from \"./validator.functions\";\n\ndescribe(\"Validator functio"
  },
  {
    "path": "projects/ajsf-core/src/lib/shared/validator.functions.ts",
    "chars": 21178,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { from, Observable } from 'rxjs';\n\n/**\n * Validator utility fun"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/add-reference.component.ts",
    "chars": 1575,
    "preview": "import {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  OnInit\n  } from '@angular/core';\nimport { JsonSchemaFormServ"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/button.component.ts",
    "chars": 1520,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { Jso"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/checkbox.component.ts",
    "chars": 2561,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { Jso"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/checkboxes.component.ts",
    "chars": 4021,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { buildTitleMap } from '../shared';\nimport { Component, Input, "
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/file.component.ts",
    "chars": 851,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { Jso"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/hidden.component.ts",
    "chars": 1023,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { Jso"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/index.ts",
    "chars": 3030,
    "preview": "import { AddReferenceComponent } from './add-reference.component';\nimport { ButtonComponent } from './button.component';"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/input.component.ts",
    "chars": 2749,
    "preview": "import { AbstractControl } from '@angular/forms';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { Jso"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/message.component.ts",
    "chars": 783,
    "preview": "import { Component, Input, OnInit } from '@angular/core';\nimport { JsonSchemaFormService } from '../json-schema-form.ser"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/none.component.ts",
    "chars": 284,
    "preview": "import { Component, Input } from '@angular/core';\n\n@Component({\n  // tslint:disable-next-line:component-selector\n  selec"
  },
  {
    "path": "projects/ajsf-core/src/lib/widget-library/number.component.ts",
    "chars": 2903,
    "preview": "import { Component, Input, OnInit } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\n\nimport { Js"
  }
]

// ... and 61 more files (download for full content)

About this extraction

This page contains the full source code of the hamzahamidi/ajsf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 261 files (696.5 KB), approximately 188.4k tokens, and a symbol index with 493 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!