├── .babelrc ├── .gitignore ├── src ├── filters │ └── index.js ├── components │ ├── index.js │ ├── FormlyForm.js │ └── FormlyField.js ├── index.js ├── directives │ └── index.js └── util.js ├── test └── unit │ ├── index.js │ ├── karma.conf.js │ ├── webpack.test.config.js │ └── specs │ ├── index.spec.js │ ├── FormlyForm.spec.js │ └── FormlyField.spec.js ├── .eslintrc.js ├── LICENSE ├── webpack.build.config.js ├── package.json ├── README.md └── dist ├── vue-formly.min.js └── vue-formly.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "stage-0"], 3 | "plugins": ["transform-runtime"], 4 | "comments": false 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | \#*\# 3 | /.emacs.desktop 4 | /.emacs.desktop.lock 5 | 6 | # flymake-mode 7 | *_flymake.* 8 | 9 | # Flycheck 10 | flycheck_*.el 11 | 12 | node_modules/ 13 | coverage/ 14 | test/unit/coverage 15 | 16 | shrinkwrap.yaml -------------------------------------------------------------------------------- /src/filters/index.js: -------------------------------------------------------------------------------- 1 | export default function(Vue){ 2 | //filter valid formly fields. 3 | //this shouldn't pass any $ fields. eg $errors or $valid 4 | Vue.filter('formlyFields', (fields) => { 5 | let re = /^\$/; 6 | let valid = Object.keys(fields).filter( (key) => { 7 | return !re.test(key); 8 | }); 9 | return valid; 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /test/unit/index.js: -------------------------------------------------------------------------------- 1 | // require all test files (files that ends with .spec.js) 2 | var testsContext = require.context('./specs', true, /\.spec$/); 3 | testsContext.keys().forEach(testsContext); 4 | 5 | 6 | // require all src files except main.js for coverage. 7 | // you can also change this to match only the subset of files that 8 | // you want coverage for. 9 | var srcContext = require.context('src', true, /\.(js|vue)$/); 10 | srcContext.keys().forEach(srcContext); 11 | -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | import FormlyForm from './FormlyForm'; 2 | import FormlyField from './FormlyField'; 3 | 4 | export default function(Vue){ 5 | Vue.component('formly-form', FormlyForm); 6 | 7 | Vue.component('formly-field', (resolve) => { 8 | /** 9 | * FormlyField must be loaded asyncronously so that any fields added in 10 | * via Formly.addType are available 11 | */ 12 | resolve(FormlyField); 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | "env": { 4 | "browser": true, 5 | "commonjs": true, 6 | "es6": true, 7 | "jquery": false, 8 | mocha: true 9 | }, 10 | "extends": "eslint:recommended", 11 | "parserOptions": { 12 | "sourceType": "module" 13 | }, 14 | "plugins": [ 15 | "html" 16 | ], 17 | "rules": { 18 | "indent": [ 19 | "warn", 20 | "tab" 21 | ], 22 | "quotes": [ 23 | "warn", 24 | "double" 25 | ], 26 | "semi": [ 27 | "error", 28 | "always" 29 | ], 30 | "no-var": [ 31 | "error" 32 | ], 33 | "no-console": [ 34 | "off" 35 | ], 36 | "no-unused-vars": [ 37 | "warn" 38 | ] 39 | } 40 | }; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Components from './components/index'; 2 | import Filters from './filters/index'; 3 | import Util,{getTypes, addType, addValidationMessage, set, get} from './util'; 4 | import Directives from './directives/index'; 5 | 6 | 7 | let Formly = { 8 | getTypes, 9 | addType, 10 | addValidationMessage, 11 | install(Vue, options){ 12 | 13 | //install our components 14 | Directives(Vue); 15 | Components(Vue); 16 | Filters(Vue); 17 | 18 | Vue.$formly = {getTypes, addType, addValidationMessage}; 19 | Vue.prototype.$formlySet = set; 20 | Vue.prototype.$formlyGet = get; 21 | } 22 | }; 23 | 24 | //auto install 25 | if (typeof window !== 'undefined' && window.Vue) { 26 | window.Vue.use(Formly); 27 | //expose formly functions if auto installed 28 | window.Vue.$formly = {getTypes, addType, addValidationMessage}; 29 | } 30 | export default Formly; 31 | -------------------------------------------------------------------------------- /src/directives/index.js: -------------------------------------------------------------------------------- 1 | export default function(Vue){ 2 | 3 | /** 4 | * Allows the user to pass extra attributes that should be added to the element. Such as placeholder etc etc 5 | * @param {Object} value 6 | */ 7 | Vue.directive('formly-atts',{ 8 | bind:function(el, binding){ 9 | 10 | if ( !binding.value ) return; 11 | 12 | Object.keys(binding.value).forEach((key) => { 13 | el.setAttribute(key, binding.value[key]); 14 | }); 15 | 16 | } 17 | }); 18 | 19 | /** 20 | * In Vue 2.0 we cannot bind the :type and v-model at the same time. 21 | * They recommended using if statements to render our elements, but that's just ridiculous for a project like this 22 | * So instead we'll use this directive to add the type when the element is bound 23 | */ 24 | Vue.directive('formly-input-type', { 25 | bind: function(el, binding){ 26 | if ( !binding.value ) return; 27 | 28 | el.setAttribute('type', binding.value); 29 | } 30 | }); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 matt-sanders 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/unit/karma.conf.js: -------------------------------------------------------------------------------- 1 | var wsConfig = require('./webpack.test.config'); 2 | 3 | module.exports = function(config) { 4 | var settings = { 5 | // base path that will be used to resolve all patterns (eg. files, exclude) 6 | basePath: '', 7 | plugins: ['karma-mocha', 'karma-chai', 'karma-sinon-chai', 'karma-webpack', 'karma-sourcemap-loader', 'karma-spec-reporter', 'karma-coverage', 'karma-phantomjs-launcher'], 8 | 9 | browsers: ['PhantomJS'], 10 | 11 | reporters: ['spec', 'coverage'], 12 | 13 | frameworks: ['mocha', 'chai', 'sinon-chai'], 14 | 15 | files: ['./index.js'], 16 | 17 | exclude: [], 18 | 19 | preprocessors: { 20 | './index.js': ['webpack', 'sourcemap'] 21 | }, 22 | 23 | webpack: wsConfig, 24 | 25 | webpackMiddleware: { 26 | noInfo: true 27 | }, 28 | 29 | port: 9876, 30 | 31 | colors: true, 32 | 33 | logLevel: config.LOG_INFO, 34 | 35 | autoWatch: false, 36 | 37 | singleRun: true, 38 | 39 | coverageReporter: { 40 | dir: './coverage', 41 | reporters: [ 42 | { type: 'lcov', subdir: '.' }, 43 | { type: 'text-summary' } 44 | ] 45 | } 46 | } 47 | 48 | config.set(settings); 49 | } 50 | -------------------------------------------------------------------------------- /test/unit/webpack.test.config.js: -------------------------------------------------------------------------------- 1 | var path = require("path"); 2 | var webpack = require('webpack'); 3 | var sourceDir = path.resolve(__dirname, '../../src'); 4 | module.exports = { 5 | devtool: '#inline-source-map', 6 | 7 | module: { 8 | preLoaders: [ 9 | { 10 | test: /\.js$/, 11 | loader: 'isparta', 12 | include: sourceDir, 13 | exclude: /node_modules/ 14 | } 15 | ], 16 | 17 | loaders: [ 18 | { 19 | "test": /\.vue$/, 20 | "loader": "vue" 21 | }, 22 | { 23 | "test": /\.js$/, 24 | //"include": /test\/unit/, 25 | "exclude": /node_modules/, 26 | "loader": "babel" 27 | }, 28 | { 29 | "test": /\.css?$/, 30 | "loader": "style!css" 31 | }, 32 | { 33 | "test": /\.scss?$/, 34 | "loader": "style!css!sass" 35 | }, 36 | { 37 | "test": /\.jade?$/, 38 | "loader": "jade" 39 | }, 40 | { 41 | test: /\.(woff2?|svg)$/, 42 | loader: 'url' 43 | //loader: 'url?limit=10000' 44 | }, 45 | { 46 | test: /\.(ttf|eot)$/, 47 | loader: 'url' 48 | } 49 | ], 50 | noParse: [ 51 | /node_modules\/sinon\//, 52 | ] 53 | }, 54 | 55 | resolve: { 56 | packageAlias: 'browser', 57 | alias: { 58 | 'src': sourceDir, 59 | 'sinon': 'sinon/pkg/sinon', 60 | 'vue': 'vue/dist/vue.js' 61 | } 62 | }, 63 | plugins: [ 64 | ], 65 | 66 | vue: { 67 | autoprefixer: { 68 | browsers: ['last 2 versions'] 69 | }, 70 | loaders: { 71 | js: 'isparta' 72 | } 73 | } 74 | 75 | }; 76 | -------------------------------------------------------------------------------- /webpack.build.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require("webpack"); 2 | var version = require("./package.json").version; 3 | var banner = "/**\n" + " * vue-formly v" + version + "\n" + " * https://github.com/matt-sanders/vue-formly\n" + " * Released under the MIT License.\n" + " */\n"; 4 | var ExtractTextPlugin = require("extract-text-webpack-plugin"); 5 | 6 | var loaders = [ 7 | { 8 | "test": /\.js?$/, 9 | "exclude": /node_modules/, 10 | "loader": "babel" 11 | }, 12 | { 13 | "test": /\.vue?$/, 14 | "loader": "vue" 15 | } 16 | ]; 17 | 18 | module.exports = [ 19 | { 20 | entry: "./src/index", 21 | output: { 22 | path: "./dist", 23 | filename: "vue-formly.js", 24 | library: "VueFormly", 25 | libraryTarget: "umd" 26 | }, 27 | 28 | plugins: [ 29 | new webpack.DefinePlugin({ 30 | 'process.env' : { 31 | NODE_ENV : JSON.stringify('production') 32 | } 33 | }), 34 | new webpack.optimize.UglifyJsPlugin({ 35 | compress: false, 36 | mangle: false 37 | }), 38 | new webpack.optimize.DedupePlugin(), 39 | new webpack.BannerPlugin(banner, { 40 | raw: true 41 | }), 42 | new ExtractTextPlugin('vue-formly.css', { allChunks: true }), 43 | ], 44 | 45 | module: { 46 | loaders: loaders 47 | }, 48 | 49 | vue: { 50 | loaders: { 51 | css: ExtractTextPlugin.extract('css'), 52 | postcss: ExtractTextPlugin.extract('css'), 53 | sass: ExtractTextPlugin.extract('css!sass'), 54 | } 55 | }, 56 | 57 | resolve: { 58 | packageAlias: 'browser' 59 | } 60 | }, 61 | 62 | { 63 | entry: "./src/index", 64 | output: { 65 | path: "./dist", 66 | filename: "vue-formly.min.js", 67 | library: "VueFormly", 68 | libraryTarget: "umd" 69 | }, 70 | plugins: [ 71 | new webpack.optimize.UglifyJsPlugin({ 72 | compress: { 73 | warnings: false 74 | } 75 | }), 76 | new webpack.optimize.DedupePlugin(), 77 | new webpack.DefinePlugin({ 78 | 'process.env' : { 79 | NODE_ENV : JSON.stringify('production') 80 | } 81 | }), 82 | new webpack.BannerPlugin(banner, { 83 | raw: true 84 | }) 85 | ], 86 | 87 | module: { 88 | loaders: loaders 89 | }, 90 | 91 | resolve: { 92 | packageAlias: 'browser' 93 | } 94 | 95 | } 96 | 97 | ]; 98 | -------------------------------------------------------------------------------- /src/components/FormlyForm.js: -------------------------------------------------------------------------------- 1 | export default { 2 | render(h){ 3 | let children = []; 4 | if ( !this.customLayout ){ 5 | const self = this; 6 | children = this.fields.map( function(field){ 7 | return h('formly-field', { 8 | key: `formly_${field.key}`, 9 | ref: field.key, 10 | props: { 11 | model: self.model, 12 | form: self.form, 13 | field: field 14 | } 15 | }); 16 | }); 17 | } 18 | if ( 'default' in this.$scopedSlots ) children.push( this.$scopedSlots.default({ keys: this.keys }) ); 19 | return h(this.tag ? this.tag : 'fieldset', children); 20 | }, 21 | methods: { 22 | validate(){ 23 | return new Promise((resolve, reject) => { 24 | let target = this.fields.length; 25 | let count = 0; 26 | this.fields.forEach( field => { 27 | if ( !(field.key in this.form) ) { 28 | count++; 29 | if( target == count ) resolve(); 30 | return; 31 | } 32 | this.$set( this.form[ field.key ], '$dirty', true ); 33 | let validate; 34 | if ( field.key in this.$refs ){ 35 | validate = this.$refs[ field.key ].validate; 36 | } else { 37 | this.$children.some( child => { 38 | if ( ! ( 'field' in child ) ) return false; 39 | if ( child.field.key === field.key ){ 40 | validate = child.validate; 41 | return true; 42 | } 43 | }); 44 | } 45 | 46 | if ( typeof validate !== 'function' ){ 47 | count++; 48 | if( target == count ) resolve(); 49 | return; 50 | } 51 | 52 | validate() 53 | .then(()=>{ 54 | count++; 55 | if( target == count ) resolve(); 56 | }) 57 | .catch((e)=>{ 58 | reject(e); 59 | }); 60 | }); 61 | }); 62 | } 63 | }, 64 | props: ['form', 'model', 'fields', 'customLayout','tag'], 65 | computed:{ 66 | keys(){ 67 | let keys = {}; 68 | this.fields.forEach( field => { 69 | keys[field.key] = field; 70 | }); 71 | return keys; 72 | } 73 | }, 74 | created(){ 75 | 76 | //make sure that the 'value' is always set 77 | this.fields.forEach( field => { 78 | if ( typeof this.model[ field.key ] == 'undefined' ) this.$set(this.model, field.key, ''); 79 | }); 80 | 81 | 82 | //set our validation options 83 | this.$set(this.form, '$errors', {}); 84 | this.$set(this.form, '$valid', true); 85 | 86 | this.$watch('form.$errors', function(val){ 87 | let valid = true; 88 | Object.keys(this.form.$errors).forEach((key)=>{ 89 | let errField = this.form.$errors[key]; 90 | Object.keys(errField).forEach((errKey) => { 91 | if ( errField[errKey] ) valid = false; 92 | }) 93 | }); 94 | this.form.$valid = valid; 95 | }, { 96 | deep: true 97 | }); 98 | 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-formly", 3 | "version": "2.5.9", 4 | "description": "A simple and extendable form builder for Vue.js", 5 | "main": "dist/vue-formly.js", 6 | "scripts": { 7 | "test": "karma start test/unit/karma.conf.js", 8 | "build": "webpack --config webpack.build.config.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/formly-js/vue-formly.git" 13 | }, 14 | "keywords": [ 15 | "vue", 16 | "vuejs", 17 | "form" 18 | ], 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/formly-js/vue-formly/issues" 22 | }, 23 | "homepage": "https://github.com/formly-js/vue-formly#readme", 24 | "peerDependencies": { 25 | "vue": "2.x" 26 | }, 27 | "devDependencies": { 28 | "babel-core": "6.11.4", 29 | "babel-loader": "6.2.4", 30 | "babel-plugin-transform-runtime": "6.12.0", 31 | "babel-preset-es2015": "6.9.0", 32 | "babel-preset-es2015-loose-rollup": "^7.0.0", 33 | "babel-preset-stage-0": "6.5.0", 34 | "chai": "3.5.0", 35 | "conventional-changelog-cli": "1.2.0", 36 | "conventional-github-releaser": "1.1.3", 37 | "coveralls": "2.11.12", 38 | "css-loader": "0.23.1", 39 | "eslint": "3.2.2", 40 | "eslint-friendly-formatter": "2.0.6", 41 | "eslint-loader": "1.5.0", 42 | "eslint-plugin-html": "1.5.1", 43 | "eslint-plugin-vue": "0.1.1", 44 | "extract-text-webpack-plugin": "1.0.1", 45 | "fakerator": "0.3.0", 46 | "gitbook-cli": "2.3.0", 47 | "inject-loader": "2.0.1", 48 | "isparta-loader": "2.0.0", 49 | "jade": "1.11.0", 50 | "jade-loader": "0.8.0", 51 | "karma": "1.1.2", 52 | "karma-chai": "0.1.0", 53 | "karma-chrome-launcher": "1.0.1", 54 | "karma-coverage": "1.1.1", 55 | "karma-coveralls": "1.1.2", 56 | "karma-mocha": "1.1.1", 57 | "karma-phantomjs-launcher": "1.0.1", 58 | "karma-sinon-chai": "1.2.3", 59 | "karma-sourcemap-loader": "0.3.7", 60 | "karma-spec-reporter": "0.0.26", 61 | "karma-webpack": "1.7.0", 62 | "lolex": "1.5.1", 63 | "mocha": "2.5.3", 64 | "mocha-generators": "1.2.0", 65 | "mocha-loader": "0.7.1", 66 | "node-sass": "3.8.0", 67 | "phantomjs-prebuilt": "2.1.10", 68 | "replace-in-file": "^1.1.1", 69 | "rollup": "^0.33.0", 70 | "rollup-plugin-babel": "^2.6.1", 71 | "sass-loader": "3.2.0", 72 | "sinon": "1.17.5", 73 | "sinon-chai": "2.8.0", 74 | "style-loader": "0.13.1", 75 | "uglify-js": "^2.6.4", 76 | "vue": "^2.2.6", 77 | "vue-hot-reload-api": "1.3.2", 78 | "vue-html-loader": "1.2.3", 79 | "vue-loader": "8.5.3", 80 | "vue-style-loader": "1.0.0", 81 | "webpack": "1.13.1", 82 | "webpack-dev-middleware": "1.6.1", 83 | "webpack-dev-server": "1.14.1", 84 | "webpack-merge": "0.14.1" 85 | }, 86 | "dependencies": { 87 | "babel-runtime": "^6.23.0", 88 | "vue": "^2.2.6" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue Formly 2 | 3 | ## Looking for maintainers 4 | 5 | It's been many years since I first created Vue Formly and it's been a great project. However, it was a project that started because I couldn't quite find anything that fit my requirements at the time. I've sinced moved on, things have changed, and I no longer have the time I need to keep working on this. So if you'd like to get on board or take it into Vue 3 support, you're most welcome. 6 | 7 | ## About 8 | 9 | Vue Formly is a JS based form builder heavily inspired by [Angular Formly](http://angular-formly.com/). Vue Formly was designed to provide an easy way to keep your forms consistent and to remove bloat from your code. As there's no "one way" to design your forms, Vue Formly allows you to create custom input types which you can use in your form schemas. Vue Formly itself does not come with any inputs pre-loaded but a set of Boostrap form inputs can be installed over at [Vue Formly Bootstrap](https://github.com/formly-js/vue-formly-bootstrap). 10 | 11 | *NOTE* 12 | This is version 2 of Vue Formly and is only compatible with Vue 2.x. If you are wanting to use this with Vue 1.x then check out the [Vue Formly 1 Branch](https://github.com/formly-js/vue-formly/tree/1.0). 13 | 14 | ## Installation 15 | ``` 16 | npm install vue-formly 17 | ``` 18 | Or via a script 19 | ```html 20 | 21 | ``` 22 | ## Usage 23 | Take a look at the [docs](https://matt-sanders.gitbooks.io/vue-formly/content/v/2.0/) for extended information about using Formly and creating custom input types. But here is a quick example: 24 | *NOTE* that for Vue Formly to work correctly you must also include a set of input types. You can either create your own or check out [Vue Formly Bootstrap](https://github.com/formly-js/vue-formly-bootstrap) which has many already created for you. 25 | ```html 26 |
27 |
28 | 29 | 30 |
31 |
32 | ``` 33 | ```js 34 | new Vue({ 35 | el: '#app', 36 | data: { 37 | model: { 38 | name: '', 39 | email: '', 40 | password: '' 41 | }, 42 | form: {}, 43 | fields: [ 44 | { 45 | key: 'name', 46 | type: 'input', 47 | required: true 48 | }, 49 | { 50 | key: 'email', 51 | type: 'input', 52 | templateOptions: { 53 | type: 'email' 54 | }, 55 | required: true, 56 | validators: { 57 | validEmail: checkEmailFunction 58 | } 59 | }, 60 | { 61 | key: 'password', 62 | type: 'input', 63 | templateOptions: { 64 | type: 'password' 65 | }, 66 | required: true, 67 | validators: { 68 | validPassword: checkPasswordFunction 69 | } 70 | } 71 | ] 72 | } 73 | }); 74 | ``` 75 | -------------------------------------------------------------------------------- /src/util.js: -------------------------------------------------------------------------------- 1 | const exports = { 2 | formlyFields: {}, 3 | validationMessages: {} 4 | }; 5 | export default exports; 6 | 7 | /** 8 | * Allow additional templates to be added 9 | * When they're created they should be prefixed so they don't conflict with native components 10 | * eg. addType('input', {}) will be available as 11 | * @param {String} id 12 | * @param {Object} options 13 | */ 14 | export function addType(id, options) { 15 | exports.formlyFields['formly_' + id] = options; 16 | } 17 | 18 | export function getTypes() { 19 | return exports.formlyFields; 20 | } 21 | 22 | /** 23 | * Allows deep nesting or not, depending on compatability 24 | * Should first check for the deeply nested field. If it doesn't exist then we treat the key as target[key] 25 | * If it does exist, then we set it 26 | * @param {Object} target 27 | * @param {String} key 28 | * @param {Mixed} val 29 | */ 30 | export function set(target, key, val) { 31 | if (hasNestedProperty(target, key)) { 32 | const parts = key.split('.'); 33 | const finalKey = parts.pop(); 34 | const newTarget = parts.reduce((acc, cur) => acc[cur], target); 35 | this.$set(newTarget, finalKey, val); 36 | } else { 37 | this.$set(target, key, val); 38 | } 39 | } 40 | 41 | /** 42 | * returns an object value by string 43 | * @param {Object} target 44 | * @param {String} key 45 | */ 46 | export function get(target, key) { 47 | const hasNested = hasNestedProperty(target, key, true); 48 | return hasNested === null ? target[key] : hasNested; 49 | } 50 | 51 | /** 52 | * Checks to see whether an object has a deeply nested path 53 | * @param {Object} target 54 | * @param {String} propertyPath 55 | * @param {Boolean} returnVal 56 | * @returns {Boolean || Any} will return either true/false for existance or the actual value 57 | */ 58 | function hasNestedProperty(obj, propertyPath, returnVal = false) { 59 | if (!propertyPath) return false; 60 | 61 | // strip the leading dot 62 | propertyPath = propertyPath.replace(/^\./, ''); 63 | const properties = propertyPath.split('.'); 64 | 65 | for (var i = 0; i < properties.length; i++) { 66 | var prop = properties[i]; 67 | 68 | if (!obj || !obj.hasOwnProperty(prop)) { 69 | return returnVal ? null : false; 70 | } else { 71 | obj = obj[prop]; 72 | } 73 | } 74 | 75 | return returnVal ? obj : true; 76 | } 77 | 78 | /** 79 | * Allows a field to add/remove errors to the form 80 | * @param {Object} form 81 | * @param {String} key 82 | * @param {String} err 83 | * @param {Bool} isError 84 | */ 85 | export function setError(form, key, err, isError, message = false) { 86 | if (!form.$errors[key]) form.$errors[key] = {}; 87 | form.$errors[key][err] = isError ? message || isError : false; 88 | } 89 | 90 | /** 91 | * Adds a validation string to Vue Formly to be used later on by validations 92 | * @param {string} key 93 | * @param {string} message 94 | */ 95 | export function addValidationMessage(key, message) { 96 | exports.validationMessages[key] = message; 97 | } 98 | 99 | /** 100 | * Given a message key or message it parses in the label and the value 101 | * @param {string/bool} key 102 | * @param {string} message 103 | * @param {string} label 104 | * @param {string} value 105 | */ 106 | export function parseValidationString(key, message, label, value) { 107 | // if a key has been passed and there's no validation message and no message has been passed then return 108 | if (key && !(key in exports.validationMessages) && !message) return false; 109 | 110 | // first check if a validation message with this key exists 111 | if (key in exports.validationMessages) { 112 | message = exports.validationMessages[key]; 113 | } 114 | 115 | let output = message.replace(/\%l/g, label).replace(/\%v/g, value); 116 | return output; 117 | } 118 | -------------------------------------------------------------------------------- /test/unit/specs/index.spec.js: -------------------------------------------------------------------------------- 1 | import {expect} from 'chai'; 2 | import Vue from 'vue'; 3 | import VueFormly from 'src/index'; 4 | import Util, { 5 | addType, 6 | getTypes, 7 | setError, 8 | addValidationMessage, 9 | parseValidationString, 10 | set, 11 | get 12 | } from 'src/util'; 13 | 14 | describe('module', () => { 15 | it('module props', () => { 16 | expect(VueFormly).to.exist; 17 | expect(VueFormly.install).to.be.a('function'); 18 | expect(VueFormly.addType).to.be.a('function'); 19 | expect(VueFormly.getTypes).to.be.a('function'); 20 | expect(VueFormly.addValidationMessage).to.be.a('function'); 21 | expect(addType).to.be.a('function'); 22 | expect(getTypes).to.be.a('function'); 23 | expect(setError).to.be.a('function'); 24 | expect(Util.formlyFields).to.be.a('object'); 25 | }); 26 | 27 | it('addType()', () => { 28 | //mock vue 29 | window.Vue = { 30 | component() {}, 31 | filter() {} 32 | }; 33 | VueFormly.install(Vue); 34 | 35 | let newField = { 36 | foo: 'bar' 37 | }; 38 | addType('test', newField); 39 | expect(getTypes().formly_test).to.deep.equal(newField); 40 | }); 41 | 42 | it('setError()', () => { 43 | let form = { 44 | $errors: {} 45 | }; 46 | setError(form, 'fname', 'required', true); 47 | expect(form.$errors.fname.required).to.be.true; 48 | 49 | setError(form, 'fname', 'required', false); 50 | expect(form.$errors.fname.required).to.be.false; 51 | 52 | setError(form, 'fname', 'required', true, 'Hey there'); 53 | expect(form.$errors.fname.required).to.equal('Hey there'); 54 | 55 | setError(form, 'fname', 'required', false, 'Hey there'); 56 | expect(form.$errors.fname.required).to.be.false; 57 | }); 58 | 59 | it('addValidationMessage()', () => { 60 | addValidationMessage('test', 'testing'); 61 | expect(Util.validationMessages.test).to.equal('testing'); 62 | }); 63 | 64 | it('parseValidationString()', () => { 65 | addValidationMessage('parseTest', '%l just %v testing'); 66 | let message = '%l just %v testing'; 67 | let expected = 'label just value testing'; 68 | let output = parseValidationString('parseTest', false, 'label', 'value'); 69 | expect(output).to.equal(expected); 70 | 71 | output = parseValidationString(false, message, 'label', 'value'); 72 | expect(output).to.equal(expected); 73 | 74 | output = parseValidationString('blahblahblah', false, '', ''); 75 | expect(output).to.be.false; 76 | }); 77 | 78 | describe('get()', () => { 79 | it('should be present on the Vue instance', () => { 80 | const test = new Vue(); 81 | expect(test.$formlyGet).to.be.a('function'); 82 | }); 83 | 84 | it('should get a nested field, and one with dot notation', () => { 85 | const test = new Vue({ 86 | data: { 87 | deeply: { 88 | nested: { 89 | child: 'foo' 90 | }, 91 | 'child.nested': 'bar' 92 | } 93 | } 94 | }); 95 | 96 | expect(test.deeply.nested.child).to.equal('foo'); 97 | expect(test.deeply['child.nested']).to.equal('bar'); 98 | expect(test.$formlyGet(test.deeply, 'nested.child')).to.equal('foo'); 99 | expect(test.$formlyGet(test.deeply, 'child.nested')).to.equal('bar'); 100 | }); 101 | }); 102 | 103 | describe('set()', () => { 104 | it('should be present on the Vue instance', () => { 105 | const test = new Vue(); 106 | expect(test.$formlySet).to.be.a('function'); 107 | }); 108 | 109 | it('should take a nested field', () => { 110 | const test = new Vue({ 111 | data: { 112 | deeply: { 113 | nested: { 114 | child: 'foo' 115 | } 116 | } 117 | } 118 | }); 119 | 120 | expect(test.deeply.nested.child).to.equal('foo'); 121 | test.$formlySet(test.deeply, 'nested.child', 'bar'); 122 | expect(test.deeply.nested.child).to.equal('bar'); 123 | }); 124 | 125 | it('should set dotted properties', () => { 126 | const test = new Vue({ 127 | data: { 128 | deeply: { 129 | 'nested.child': 'foo' 130 | } 131 | } 132 | }); 133 | 134 | test.$formlySet(test.deeply, 'nested.child', 'bar'); 135 | expect(test.deeply['nested.child']).to.equal('bar'); 136 | }); 137 | }); 138 | 139 | describe('Directives', () => { 140 | it('formly-atts', () => { 141 | let atts = { 142 | placeholder: 'testing', 143 | foo: 'bar' 144 | }; 145 | 146 | let el = document.createElement('div'); 147 | 148 | let vm = new Vue({ 149 | data: { 150 | atts: atts 151 | }, 152 | template: '
' 153 | }).$mount(el); 154 | 155 | expect(vm.$el.getAttribute('placeholder')).to.equal(atts.placeholder); 156 | expect(vm.$el.getAttribute('foo')).to.equal(atts.foo); 157 | }); 158 | 159 | it('formly-input-type', () => { 160 | let el = document.createElement('div'); 161 | 162 | let vm = new Vue({ 163 | data: { 164 | type: 'email' 165 | }, 166 | template: '' 167 | }).$mount(el); 168 | 169 | expect(vm.$el.getAttribute('type')).to.equal('email'); 170 | }); 171 | }); 172 | }); 173 | -------------------------------------------------------------------------------- /src/components/FormlyField.js: -------------------------------------------------------------------------------- 1 | import Util, {getTypes, setError, parseValidationString } from '../util'; 2 | export default { 3 | render(h){ 4 | if ( !this.display ) return; 5 | return h(this.type, { 6 | props: { 7 | form: this.form, 8 | field: this.field, 9 | model: this.model, 10 | to: this.templateOptions 11 | } 12 | }); 13 | }, 14 | props: ['form', 'model', 'field', 'to'], 15 | computed: { 16 | templateOptions: function(){ 17 | return this.field.templateOptions || {}; 18 | }, 19 | type:function(){ 20 | return 'formly_'+this.field.type; 21 | }, 22 | display: function(){ 23 | // always show if there is no conditional display 24 | let displayType = typeof this.field.display; 25 | if ( displayType !== 'function' && displayType !== 'string' ) return true; 26 | 27 | if ( displayType === 'function' ){ 28 | return this.field.display( this.field, this.model ); 29 | } else { 30 | let result = new Function('field', 'model', 'return '+this.field.display+';' ); 31 | return result.call({}, this.field, this.model); 32 | } 33 | } 34 | }, 35 | methods: { 36 | validate:function(){ 37 | return new Promise((resolve, reject)=>{ 38 | //first check if we need to create a field 39 | if ( !this.form.$errors[this.field.key] ) this.$set(this.form.$errors, this.field.key, {}); 40 | if ( !this.field.templateOptions ) this.$set(this.field, 'templateOptions', {}); 41 | 42 | let label = ( 'templateOptions' in this.field ) && ( 'label' in this.field.templateOptions ) ? this.field.templateOptions.label : ''; 43 | 44 | if (!this.display) { 45 | this.$set(this.form.$errors, this.field.key, {}); 46 | return resolve(); 47 | } 48 | 49 | //check for required fields. This whole setting,unsetting thing seems kind of wrong though.. 50 | //there might be a more 'vue-ey' way to do this... 51 | if ( this.field.required ){ 52 | if ( !this.form.$errors[this.field.key].required ) this.$set(this.form.$errors[ this.field.key ], 'required', true); 53 | let requiredError = parseValidationString( 'required', false, label, this.model[ this.field.key ] ); 54 | let requiredType = typeof this.model[ this.field.key ] === 'string' ? !this.model[ this.field.key ] : this.model[ this.field.key] === null || this.model[this.field.key] === undefined || this.model[ this.field.key ].length === 0; 55 | let required = this.display ? requiredType : false; 56 | setError(this.form, this.field.key, 'required', required, requiredError) ; 57 | } 58 | 59 | //if we've got nothing left then return 60 | if ( !this.field.validators ) return resolve(); 61 | 62 | //set these for the validators so we don't have to use 'this' in them 63 | let model = this.model; 64 | let field = this.field; 65 | 66 | Object.keys(this.field.validators).forEach((validKey) => { 67 | if ( !this.form.$errors[this.field.key][validKey] ) this.$set(this.form.$errors[ this.field.key ], validKey, false); 68 | if ( this.field.required === false && !this.model[ this.field.key ] ) { 69 | setError(this.form, this.field.key, validKey, false ); 70 | return resolve(); 71 | } 72 | 73 | let validator = this.field.validators[validKey]; 74 | let validatorMessage = false; 75 | 76 | if ( typeof validator === 'object' ){ 77 | if ( !( 'message' in validator ) ){ 78 | console.error( "Looks like you've set a validator object without setting a message. If you don't need to explicity set the message just define the validator as either an expression or a function. Refer to the docs for more info"); 79 | } else { 80 | validatorMessage = validator.message; 81 | validator = validator.expression; 82 | } 83 | } 84 | 85 | validatorMessage = parseValidationString( validKey, validatorMessage, label, model[ this.field.key ] ); 86 | 87 | let valid = false; 88 | if ( typeof validator === 'function' ){ 89 | //set the asynchronous flag so that we know it's going 90 | let asyncKey = '$async_'+validKey; 91 | this.$set(this.form.$errors[ this.field.key ], asyncKey, true); 92 | 93 | // setup for async validation 94 | validator(field, model, (asyncValid = false, asyncValidatorMessage = validatorMessage) => { 95 | // whenever validation is done via a function we will assume it's asynchronous and will require next() to be called 96 | // this way it doesn't matter if it's async or not, next() should always be called 97 | setError(this.form, this.field.key, validKey, !asyncValid, asyncValidatorMessage); 98 | this.$set(this.form.$errors[ this.field.key ], asyncKey, false); 99 | resolve(); 100 | }); 101 | } else { 102 | let res = new Function('model', 'field', 'return '+validator+';' ); 103 | valid = !res.call({}, model, field); 104 | setError(this.form, this.field.key, validKey, valid, validatorMessage); 105 | resolve(); 106 | } 107 | 108 | }); 109 | }); 110 | } 111 | }, 112 | components: getTypes(), 113 | created(){ 114 | this.validate(); 115 | this.$watch( 116 | 'model', 117 | (val) => { let valid = this.validate();}, 118 | { deep: true } 119 | ); 120 | }, 121 | mounted(){ 122 | if ( !this.field.wrapper ) return; 123 | 124 | //create a temporary element 125 | let wrapper = document.createElement('DIV'); 126 | //populate it with the wrapper string 127 | wrapper.innerHTML = this.field.wrapper; 128 | //get the parent 129 | let parent = this.$el.parentNode; 130 | //insert the wrapper before this element 131 | parent.insertBefore(wrapper, this.$el); 132 | //append the element to the new wrapper 133 | wrapper.firstChild.appendChild( this.$el ); 134 | //move the new wrapper back to where it should be 135 | parent.insertBefore(wrapper.firstChild, wrapper); 136 | //remove the temporary element 137 | parent.removeChild(wrapper); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /test/unit/specs/FormlyForm.spec.js: -------------------------------------------------------------------------------- 1 | import chai from 'chai'; 2 | const expect = chai.expect; 3 | import sinonChai from 'sinon-chai'; 4 | import sinon from 'sinon'; 5 | import Vue from 'vue'; 6 | import FormlyForm from 'src/components/FormlyForm'; 7 | import Filters from 'src/filters/index'; 8 | Vue.component('formly-form', FormlyForm); 9 | chai.use(sinonChai); 10 | //install our filters 11 | Filters(Vue); 12 | 13 | //mock our formly-field component 14 | let FormlyField = Vue.extend({ 15 | template: '
{{field}}
{{model[ field.key ]}}
', 16 | props: ['form', 'model', 'field'] 17 | }); 18 | 19 | //our formly specific field 20 | let FormlyRestrictedField = Vue.extend({ 21 | template: '
' 22 | }); 23 | 24 | 25 | let el, vm; 26 | 27 | function createForm(template, data){ 28 | el = document.createElement('div'); 29 | //el.innerHTML = template; 30 | vm = new Vue({ 31 | data: data, 32 | template: template 33 | }).$mount(el); 34 | 35 | return [el, vm]; 36 | } 37 | 38 | 39 | describe('FormlyForm', () => { 40 | 41 | beforeEach( () => { 42 | //ensure that our mocked component is there 43 | Vue.component('formly-field', FormlyField); 44 | }); 45 | 46 | 47 | it('should create a subset of components with the right data', () => { 48 | 49 | let data = { 50 | form: {}, 51 | model: { 52 | fname: '', 53 | lname: 'smith' 54 | }, 55 | fields: [ 56 | { 57 | key: 'fname', 58 | type: 'input' 59 | }, 60 | { 61 | key: 'lname', 62 | type: 'input' 63 | } 64 | ] 65 | }; 66 | 67 | createForm('', data); 68 | 69 | //check the elements have been created 70 | 71 | expect(vm.$el.tagName).to.equal('FIELDSET'); 72 | expect(vm.$el.querySelectorAll('.formly-field')).to.be.length(2); 73 | 74 | //check their data 75 | expect(vm.$refs.form.$refs.fname.$vnode.key).to.equal('formly_fname'); 76 | expect(vm.$refs.form.$refs.lname.$vnode.key).to.equal('formly_lname') 77 | expect(vm.$el.querySelector('#lname_model').textContent).to.contain('smith'); 78 | expect(JSON.parse(vm.$el.querySelector('#fname_field').textContent)).to.deep.equal(data.fields[0]); 79 | expect(JSON.parse(vm.$el.querySelector('#lname_field').textContent)).to.deep.equal(data.fields[1]); 80 | expect(data.form.$errors).to.deep.equal({}); 81 | expect(data.form.$valid).to.be.true; 82 | 83 | }); 84 | 85 | 86 | it('should allow using a custom tag', () => { 87 | 88 | let data = { 89 | form: {}, 90 | model: { 91 | fname: '', 92 | }, 93 | fields: [ 94 | { 95 | key: 'fname', 96 | type: 'input' 97 | }, 98 | ] 99 | }; 100 | 101 | createForm('', data); 102 | 103 | //check the element have been created 104 | 105 | expect(vm.$el.tagName).to.equal('DIV'); 106 | }); 107 | 108 | it('Should not display fields if custom-layout is set', () => { 109 | 110 | let data = { 111 | form: {}, 112 | model: { 113 | fname: '', 114 | lname: 'smith' 115 | }, 116 | fields: [ 117 | { 118 | key: 'fname', 119 | type: 'input' 120 | }, 121 | { 122 | key: 'lname', 123 | type: 'input' 124 | } 125 | ] 126 | }; 127 | 128 | createForm('', data); 129 | 130 | //check the elements have been created 131 | expect(vm.$el.querySelectorAll('.formly-field')).to.be.length(1); 132 | 133 | //check their data 134 | expect(JSON.parse(vm.$el.querySelector('#fname_field').textContent)).to.deep.equal(data.fields[0]); 135 | expect(data.form.$errors).to.deep.equal({}); 136 | expect(data.form.$valid).to.be.true; 137 | 138 | }); 139 | 140 | 141 | it('should restrict some components to formly itself', () => { 142 | sinon.spy(console, 'error'); 143 | 144 | //re-create the formly field 145 | Vue.component('formly-field', (resolve) =>{ 146 | resolve({ 147 | props: ['form', 'model', 'field'], 148 | template: '', 149 | components: Vue.$formlyFields 150 | }); 151 | }); 152 | 153 | Vue.$formlyFields = { 154 | 'restricted': FormlyRestrictedField 155 | }; 156 | 157 | let data = { 158 | form: {}, 159 | fields: [ 160 | { 161 | key: 'fname', 162 | type: 'restricted' 163 | } 164 | ], 165 | model: {} 166 | }; 167 | createForm('
', data); 168 | 169 | expect(console.error).to.be.called.once; 170 | expect(vm.$el.querySelectorAll('.restricted-field')).to.be.length(1); 171 | expect(vm.$el.querySelectorAll('fieldset .restricted-field')).to.be.length(1); 172 | 173 | }); 174 | 175 | it('should compute any errors', (done) => { 176 | let data = { 177 | form: {}, 178 | model: {}, 179 | fields: [] 180 | }; 181 | createForm('', data); 182 | expect(vm.form.$errors).to.deep.equal({}); 183 | expect(vm.form.$valid).to.be.true; 184 | vm.$set(vm.form.$errors, 'test', {foo: true}); 185 | 186 | setTimeout(()=>{ 187 | expect(vm.form.$valid).to.be.false; 188 | done(); 189 | },0); 190 | }); 191 | 192 | it('should skip empty errors', (done)=>{ 193 | let data = { 194 | form: {}, 195 | model: {}, 196 | fields: [] 197 | }; 198 | createForm('', data); 199 | vm.$set(vm.form.$errors, 'test', {foo: false}); 200 | setTimeout(() => { 201 | expect(vm.form.$valid).to.be.true; 202 | done(); 203 | }); 204 | }); 205 | 206 | it('validate()', (done)=>{ 207 | let formlyFieldSpy = sinon.spy(); 208 | let ValidField = Vue.extend({ 209 | template: '

ValidationField

', 210 | props: ['form', 'model', 'field'], 211 | methods: { 212 | validate(){ 213 | return new Promise(function(resolve, reject){ 214 | formlyFieldSpy(); 215 | resolve(); 216 | }); 217 | } 218 | } 219 | }); 220 | 221 | let data = { 222 | form: { 223 | validTest: { 224 | $dirty: false 225 | }, 226 | validTest2: { 227 | $dirty: false 228 | } 229 | }, 230 | model: {validTest:'', validTest2: ''}, 231 | fields: [{ 232 | key: 'validTest', 233 | type: 'input' 234 | }, 235 | { 236 | key: 'validTest2', 237 | type: 'input' 238 | }] 239 | }; 240 | 241 | el = document.createElement('DIV'); 242 | document.body.appendChild(el); 243 | Vue.component('formly-field', ValidField); 244 | vm = new Vue({ 245 | data: data, 246 | template: '' 247 | }).$mount(el); 248 | 249 | let spy = sinon.spy(); 250 | 251 | let prom = vm.$children[0].validate(); 252 | prom.then(()=>spy()); 253 | setTimeout(()=>{ 254 | spy.should.be.calledOnce; 255 | formlyFieldSpy.should.be.calledTwice; 256 | done(); 257 | }); 258 | }); 259 | }); 260 | 261 | -------------------------------------------------------------------------------- /test/unit/specs/FormlyField.spec.js: -------------------------------------------------------------------------------- 1 | import chai from 'chai'; 2 | const expect = chai.expect; 3 | import Vue from 'vue'; 4 | import FormlyField from 'src/components/FormlyField'; 5 | import Utils from 'src/util'; 6 | import sinon from 'sinon'; 7 | import sinonChai from 'sinon-chai'; 8 | chai.use(sinonChai); 9 | 10 | let el, vm; 11 | 12 | function createForm(template, data){ 13 | el = document.createElement('DIV'); 14 | document.body.appendChild(el); 15 | //el.innerHTML = template; 16 | vm = new Vue({ 17 | data: data, 18 | template: template, 19 | components: { 20 | 'formly-field': FormlyField 21 | } 22 | }).$mount(el); 23 | 24 | return [el, vm]; 25 | } 26 | 27 | 28 | describe('FormlyField', () => { 29 | 30 | it('should take on the type of another component', () => { 31 | 32 | Vue.component('formly_test', { 33 | props: ['form', 'model', 'field'], 34 | template: '
{{field.type}}
' 35 | }); 36 | 37 | let data = { 38 | form:{ 39 | $errors: {}, 40 | $valid: {}, 41 | }, 42 | fields: [ 43 | { 44 | key: 'test', 45 | type: 'test' 46 | } 47 | ], 48 | model: { 49 | test: '' 50 | } 51 | }; 52 | 53 | createForm('', data); 54 | 55 | expect(vm.$el.textContent).to.equal(data.fields[0].type); 56 | 57 | }); 58 | 59 | 60 | it('should mimic the model of the parent', (done) => { 61 | 62 | Vue.component('formly_test', { 63 | props: ['form', 'field', 'model'], 64 | template: '' 65 | }); 66 | 67 | let data = { 68 | form: { 69 | $errors: {}, 70 | $valid: {} 71 | }, 72 | fields: [ 73 | { 74 | key: 'search', 75 | type: 'test' 76 | } 77 | ], 78 | model: { 79 | search: 'foo' 80 | } 81 | }; 82 | 83 | createForm('', data); 84 | 85 | expect(vm.$el.value).to.equal('foo'); 86 | 87 | //change the value and expect a change 88 | vm.model.search = 'bar'; 89 | 90 | setTimeout(() => { 91 | expect(vm.$el.value).to.equal('bar'); 92 | done(); 93 | }, 0); 94 | 95 | }); 96 | 97 | it('Should pass template options', () => { 98 | 99 | Vue.component('formly_test', { 100 | props: ['form', 'field', 'model', 'to'], 101 | template: '
{{to}}
' 102 | }); 103 | 104 | let data = { 105 | form: { 106 | $errors: {}, 107 | $valid: {} 108 | }, 109 | fields: [ 110 | { 111 | key: 'search', 112 | type: 'test', 113 | templateOptions: { 114 | foo: 'bar', 115 | something: 'else' 116 | } 117 | } 118 | ], 119 | model: { 120 | search: '' 121 | } 122 | }; 123 | 124 | createForm('', data); 125 | 126 | expect(JSON.parse(vm.$el.textContent)).to.deep.equal(data.fields[0].templateOptions); 127 | 128 | }); 129 | 130 | it('Should default {} to templateOptions if none are defined', () => { 131 | Vue.component('formly_test', { 132 | props: ['form', 'field', 'model', 'to'], 133 | template: '
' 134 | }); 135 | 136 | let data = { 137 | form: { 138 | $errors: {}, 139 | $valid: {} 140 | }, 141 | fields: [ 142 | { 143 | key: 'search', 144 | type: 'test' 145 | } 146 | ], 147 | model: { 148 | search: '' 149 | } 150 | }; 151 | 152 | createForm('', data); 153 | 154 | expect(vm.$refs.formlyField.templateOptions).to.deep.equal({}); 155 | }); 156 | 157 | it('Should take a wrapper string', () => { 158 | Vue.component('formly_test', { 159 | props: ['form', 'field', 'model', 'to'], 160 | template: '
' 161 | }); 162 | 163 | let data = { 164 | form: { 165 | $errors: {}, 166 | $valid: {} 167 | }, 168 | fields: [ 169 | { 170 | key: 'wrapped', 171 | type: 'test', 172 | wrapper: '
' 173 | } 174 | ], 175 | model: { 176 | wrapped: '' 177 | } 178 | }; 179 | createForm('', data); 180 | 181 | let parent = vm.$el.parentNode; 182 | expect(parent.firstChild).to.equal(vm.$el); 183 | expect(parent.id).to.equal('test_wrapper_element'); 184 | }); 185 | 186 | it('Should be hidden if display is false', (done) => { 187 | Vue.component('formly_test', { 188 | props: ['form', 'field', 'model'], 189 | template: '
' 190 | }); 191 | 192 | let data = { 193 | form: { 194 | $errors: {}, 195 | $valid: true 196 | }, 197 | model: { 198 | hidden: '', 199 | hiddenVal: 'test' 200 | }, 201 | fields: [ 202 | { 203 | key: 'hidden', 204 | type: 'test', 205 | display: function(field, model){ 206 | return model.hiddenVal === 'hello'; 207 | } 208 | } 209 | ] 210 | }; 211 | 212 | createForm('', data); 213 | expect(vm.$el.nodeName).to.equal('#comment'); 214 | data.model.hiddenVal = 'hello'; 215 | setTimeout(()=>{ 216 | expect(vm.$el.style.display).to.equal(''); 217 | done(); 218 | }); 219 | }); 220 | 221 | it('Should take a display property as a string expression', (done) => { 222 | Vue.component('formly_test', { 223 | props: ['form', 'field', 'model'], 224 | template: '
' 225 | }); 226 | 227 | let data = { 228 | form: { 229 | $errors: {}, 230 | $valid: true 231 | }, 232 | model: { 233 | hiddenString: '', 234 | hiddenStringVal: 'test' 235 | }, 236 | fields: [ 237 | { 238 | key: 'hiddenString', 239 | type: 'test', 240 | display: 'model.hiddenStringVal === "hello"' 241 | } 242 | ] 243 | }; 244 | 245 | createForm('', data); 246 | expect(vm.$el.nodeName).to.equal('#comment'); 247 | data.model.hiddenStringVal = 'hello'; 248 | setTimeout(()=>{ 249 | expect(vm.$el.style.display).to.equal(''); 250 | done(); 251 | }); 252 | }); 253 | 254 | 255 | describe('Validation', ()=>{ 256 | 257 | before(()=>{ 258 | Vue.component('formly_test', { 259 | props: ['form', 'field', 'model'], 260 | template: '
' 261 | }); 262 | }); 263 | 264 | function createValidField(data){ 265 | return createForm('', data); 266 | }; 267 | 268 | it('should return a promise', (done)=>{ 269 | let data = { 270 | form: { 271 | $valid: true, 272 | $errors: {} 273 | }, 274 | model: { 275 | search: '' 276 | }, 277 | fields: [ 278 | { 279 | key: 'search', 280 | type: 'test', 281 | required: true 282 | } 283 | ] 284 | }; 285 | createValidField(data); 286 | let cb = sinon.spy(); 287 | 288 | let prom = vm.$children[0].validate(); 289 | expect(typeof prom.then).to.equal('function'); 290 | 291 | prom.then(()=>cb()); 292 | setTimeout(()=>{ 293 | cb.should.be.called; 294 | done(); 295 | }); 296 | }); 297 | 298 | it('should handle required values', (done) => { 299 | 300 | let data = { 301 | form: { 302 | $valid: true, 303 | $errors: {} 304 | }, 305 | model: { 306 | search: '' 307 | }, 308 | fields: [ 309 | { 310 | key: 'search', 311 | type: 'test', 312 | required: true 313 | } 314 | ] 315 | }; 316 | 317 | createValidField(data); 318 | expect(vm.form.$errors.search.required).to.be.true; 319 | vm.model.search = 'testing'; 320 | setTimeout(()=>{ 321 | expect(vm.form.$errors.search.required).to.be.false; 322 | done(); 323 | },0); 324 | 325 | }); 326 | 327 | it('should only require values if they are displayed', () => { 328 | let data = { 329 | form: { 330 | $valid: true, 331 | $errors: {} 332 | }, 333 | model: { 334 | conditional: '', 335 | hiddenVal: '' 336 | }, 337 | fields: [ 338 | { 339 | key: 'conditional', 340 | type: 'test', 341 | required: true, 342 | display: function(field, model){ 343 | return model.hiddenVal === 'test'; 344 | } 345 | } 346 | ] 347 | }; 348 | 349 | createValidField(data); 350 | expect(vm.form.$errors.conditional.required).to.be.false; 351 | data.model.hiddenVal = 'test'; 352 | vm.$children[0].validate(); 353 | expect(vm.form.$errors.conditional.required).to.be.true; 354 | 355 | }); 356 | 357 | it('should take an expression', (done) => { 358 | let data = { 359 | form: { 360 | $valid: true, 361 | $errors: {} 362 | }, 363 | model: { 364 | search: 'testing' 365 | }, 366 | fields: [ 367 | { 368 | key: 'search', 369 | type: 'test', 370 | validators: { 371 | expression: 'model.search == "test"' 372 | } 373 | } 374 | ] 375 | }; 376 | 377 | createValidField(data); 378 | expect(vm.form.$errors.search.expression).to.be.true; 379 | vm.model.search = 'test'; 380 | setTimeout(()=>{ 381 | expect(vm.form.$errors.search.expression).to.be.false; 382 | done(); 383 | },0); 384 | }); 385 | 386 | it('should not require non-required values', (done) => { 387 | let data = { 388 | form: { 389 | $valid: true, 390 | $errors: {} 391 | }, 392 | model: { 393 | search: '' 394 | }, 395 | fields: [ 396 | { 397 | key: 'search', 398 | type: 'test', 399 | required: false, 400 | validators: { 401 | expression: 'field.value == "test"' 402 | } 403 | } 404 | ] 405 | }; 406 | 407 | createValidField(data); 408 | expect(vm.form.$errors.search.expression).to.be.false; 409 | 410 | vm.model.search = 'testing'; 411 | setTimeout(()=>{ 412 | expect(vm.form.$errors.search.expression).to.be.true; 413 | done(); 414 | },0); 415 | }); 416 | 417 | it('should take a function', (done) => { 418 | let data = { 419 | form: { 420 | $valid: true, 421 | $errors: {} 422 | }, 423 | model: { 424 | search: 'testing' 425 | }, 426 | fields: [ 427 | { 428 | key: 'search', 429 | type: 'test', 430 | validators: { 431 | expression: function(field, model, next){ 432 | let valid = model.search == 'test'; 433 | next( valid ); 434 | //return model.search == 'test'; 435 | } 436 | } 437 | } 438 | ] 439 | }; 440 | 441 | createValidField(data); 442 | expect(vm.form.$errors.search.expression).to.be.true; 443 | vm.model.search = 'test'; 444 | setTimeout(()=>{ 445 | expect(vm.form.$errors.search.expression).to.be.false; 446 | done(); 447 | },0); 448 | }); 449 | 450 | it('should run validators even if require does not exists and model is empty', done => { 451 | let data = { 452 | form: { 453 | $valid: true, 454 | $errors: {} 455 | }, 456 | model: { 457 | search: null 458 | }, 459 | fields: [ 460 | { 461 | key: 'search', 462 | type: 'test', 463 | validators: { 464 | aValidator: () => done() 465 | } 466 | } 467 | ] 468 | }; 469 | 470 | createValidField(data); 471 | }) 472 | 473 | it('Async Validation', (done) => { 474 | let data = { 475 | form: { 476 | $valid: true, 477 | $errors: {} 478 | }, 479 | model: { 480 | search: 'testing' 481 | }, 482 | fields: [ 483 | { 484 | key: 'search', 485 | type: 'test', 486 | validators: { 487 | asyncExpression: function(field, model, next){ 488 | let valid = model.search == 'test'; 489 | setTimeout( function(){ 490 | next( valid ); 491 | }, 500); 492 | } 493 | } 494 | } 495 | ] 496 | }; 497 | 498 | createValidField(data); 499 | expect(vm.form.$errors.search.asyncExpression).to.be.false; 500 | expect(vm.form.$errors.search.$async_asyncExpression).to.be.true; 501 | vm.model.search = 'test'; 502 | setTimeout(()=>{ 503 | expect(vm.form.$errors.search.asyncExpression).to.be.false; 504 | expect(vm.form.$errors.search.$async_asyncExpression).to.be.false; 505 | expect(vm.form.$valid).to.be.true; 506 | done(); 507 | },1000); 508 | }); 509 | 510 | describe("Validation Messages", (done) => { 511 | 512 | //what do we want to do 513 | 514 | //--- define messages --- 515 | //vf.addValidationString('validatorKey', 'message'); 516 | 517 | //add specific messages 518 | /* 519 | * validators: { 520 | * test: { 521 | * expression: function(){}, 522 | * message: '%l requires 10, you entered %s' 523 | * } 524 | * } 525 | */ 526 | 527 | it('Inline messages', () => { 528 | let data = { 529 | form: { 530 | $valid: true, 531 | $errors: {} 532 | }, 533 | model: { 534 | search: 'testing' 535 | }, 536 | fields: [ 537 | { 538 | key: 'search', 539 | type: 'test', 540 | validators: { 541 | validatorMessage: 542 | { 543 | expression: 'model.search == "test"', 544 | message: 'Must equal test' 545 | } 546 | } 547 | } 548 | ] 549 | }; 550 | 551 | createValidField(data); 552 | expect(vm.form.$errors.search.validatorMessage).to.equal('Must equal test'); 553 | }); 554 | 555 | it('Inline messages with a function', () => { 556 | let data = { 557 | form: { 558 | $valid: true, 559 | $errors: {} 560 | }, 561 | model: { 562 | search: 'testing' 563 | }, 564 | fields: [ 565 | { 566 | key: 'search', 567 | type: 'test', 568 | validators: { 569 | validatorMessage: 570 | { 571 | expression: function(field, model, next){ 572 | let valid = model.search == "test"; 573 | next(valid); 574 | }, 575 | message: 'Must equal test' 576 | } 577 | } 578 | } 579 | ] 580 | }; 581 | 582 | createValidField(data); 583 | expect(vm.form.$errors.search.validatorMessage).to.equal('Must equal test'); 584 | }); 585 | 586 | it('Inline messages with values parsed', () => { 587 | let data = { 588 | form: { 589 | $valid: true, 590 | $errors: {} 591 | }, 592 | model: { 593 | search: 'testing' 594 | }, 595 | fields: [ 596 | { 597 | key: 'search', 598 | type: 'test', 599 | templateOptions: { 600 | label: 'test' 601 | }, 602 | validators: { 603 | validatorMessage: 604 | { 605 | expression: 'model.search == "test"', 606 | message: '%l and %v' 607 | } 608 | } 609 | } 610 | ] 611 | }; 612 | 613 | createValidField(data); 614 | expect(vm.form.$errors.search.validatorMessage).to.equal('test and testing'); 615 | }); 616 | 617 | it('Global messages with values parsed', () => { 618 | let data = { 619 | form: { 620 | $valid: true, 621 | $errors: {} 622 | }, 623 | model: { 624 | search: 'testing' 625 | }, 626 | fields: [ 627 | { 628 | key: 'search', 629 | type: 'test', 630 | required: true, 631 | templateOptions: { 632 | label: 'test' 633 | }, 634 | validators: { 635 | validatorMessage: 'model.search == "test"', 636 | } 637 | } 638 | ] 639 | }; 640 | 641 | //just mock the other vue functions 642 | Utils.validationMessages.validatorMessage = '%l and %v'; 643 | 644 | createValidField(data); 645 | expect(vm.form.$errors.search.validatorMessage).to.equal('test and testing'); 646 | }); 647 | 648 | it('Global required message', () => { 649 | let data = { 650 | form: { 651 | $valid: true, 652 | $errors: {} 653 | }, 654 | model: { 655 | search: '' 656 | }, 657 | fields: [ 658 | { 659 | key: 'search', 660 | type: 'test', 661 | required: true, 662 | templateOptions: { 663 | label: 'test' 664 | } 665 | } 666 | ] 667 | }; 668 | 669 | //just mock the other vue functions 670 | Utils.validationMessages.required = 'hello world'; 671 | 672 | createValidField(data); 673 | expect(vm.form.$errors.search.required).to.equal('hello world'); 674 | }); 675 | 676 | }); 677 | 678 | }); 679 | 680 | }); 681 | 682 | -------------------------------------------------------------------------------- /dist/vue-formly.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-formly v2.5.9 3 | * https://github.com/matt-sanders/vue-formly 4 | * Released under the MIT License. 5 | */ 6 | 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.VueFormly=e():t.VueFormly=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),i=r(o),u=n(93),f=r(u),c=n(92),s=(r(c),n(94)),a=r(s),l={getTypes:c.getTypes,addType:c.addType,addValidationMessage:c.addValidationMessage,install:function(t,e){(0,a["default"])(t),(0,i["default"])(t),(0,f["default"])(t),t.$formly={getTypes:c.getTypes,addType:c.addType,addValidationMessage:c.addValidationMessage},t.prototype.$formlySet=c.set,t.prototype.$formlyGet=c.get}};"undefined"!=typeof window&&window.Vue&&(window.Vue.use(l),window.Vue.$formly={getTypes:c.getTypes,addType:c.addType,addValidationMessage:c.addValidationMessage}),e["default"]=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=function(t){t.component("formly-form",i["default"]),t.component("formly-field",function(t){t(f["default"])})};var o=n(2),i=r(o),u=n(72),f=r(u)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),i=r(o),u=n(38),f=r(u);e["default"]={render:function(t){var e=[];if(!this.customLayout){var n=this;e=this.fields.map(function(e){return t("formly-field",{key:"formly_"+e.key,ref:e.key,props:{model:n.model,form:n.form,field:e}})})}return"default"in this.$scopedSlots&&e.push(this.$scopedSlots["default"]({keys:this.keys})),t(this.tag?this.tag:"fieldset",e)},methods:{validate:function(){var t=this;return new f["default"](function(e,n){var r=t.fields.length,o=0;t.fields.forEach(function(i){if(!(i.key in t.form))return o++,void(r==o&&e());t.$set(t.form[i.key],"$dirty",!0);var u=void 0;return i.key in t.$refs?u=t.$refs[i.key].validate:t.$children.some(function(t){return"field"in t&&(t.field.key===i.key?(u=t.validate,!0):void 0)}),"function"!=typeof u?(o++,void(r==o&&e())):void u().then(function(){o++,r==o&&e()})["catch"](function(t){n(t)})})})}},props:["form","model","fields","customLayout","tag"],computed:{keys:function c(){var c={};return this.fields.forEach(function(t){c[t.key]=t}),c}},created:function(){var t=this;this.fields.forEach(function(e){"undefined"==typeof t.model[e.key]&&t.$set(t.model,e.key,"")}),this.$set(this.form,"$errors",{}),this.$set(this.form,"$valid",!0),this.$watch("form.$errors",function(t){var e=this,n=!0;(0,i["default"])(this.form.$errors).forEach(function(t){var r=e.form.$errors[t];(0,i["default"])(r).forEach(function(t){r[t]&&(n=!1)})}),this.form.$valid=n},{deep:!0})}}},function(t,e,n){t.exports={"default":n(4),__esModule:!0}},function(t,e,n){n(5),t.exports=n(25).Object.keys},function(t,e,n){var r=n(6),o=n(8);n(23)("keys",function(){return function(t){return o(r(t))}})},function(t,e,n){var r=n(7);t.exports=function(t){return Object(r(t))}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(9),o=n(22);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(10),o=n(11),i=n(14)(!1),u=n(18)("IE_PROTO");t.exports=function(t,e){var n,f=o(t),c=0,s=[];for(n in f)n!=u&&r(f,n)&&s.push(n);for(;e.length>c;)r(f,n=e[c++])&&(~i(s,n)||s.push(n));return s}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(12),o=n(7);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(13);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(11),o=n(15),i=n(17);t.exports=function(t){return function(e,n,u){var f,c=r(e),s=o(c.length),a=i(u,s);if(t&&n!=n){for(;s>a;)if(f=c[a++],f!=f)return!0}else for(;s>a;a++)if((t||a in c)&&c[a]===n)return t||a||0;return!t&&-1}}},function(t,e,n){var r=n(16),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(16),o=Math.max,i=Math.min;t.exports=function(t,e){return t=r(t),t<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(19)("keys"),o=n(21);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(20),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(24),o=n(25),i=n(34);t.exports=function(t,e){var n=(o.Object||{})[t]||Object[t],u={};u[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",u)}},function(t,e,n){var r=n(20),o=n(25),i=n(26),u=n(28),f="prototype",c=function(t,e,n){var s,a,l,d=t&c.F,p=t&c.G,v=t&c.S,y=t&c.P,h=t&c.B,m=t&c.W,g=p?o:o[e]||(o[e]={}),_=g[f],b=p?r:v?r[e]:(r[e]||{})[f];p&&(n=e);for(s in n)a=!d&&b&&void 0!==b[s],a&&s in g||(l=a?b[s]:n[s],g[s]=p&&"function"!=typeof b[s]?n[s]:h&&a?i(l,r):m&&b[s]==l?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e[f]=t[f],e}(l):y&&"function"==typeof l?i(Function.call,l):l,y&&((g.virtual||(g.virtual={}))[s]=l,t&c.R&&_&&!_[s]&&u(_,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,e){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(27);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){var r=n(29),o=n(37);t.exports=n(33)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(30),o=n(32),i=n(36),u=Object.defineProperty;e.f=n(33)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return u(t,e,n)}catch(f){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(31);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){t.exports=!n(33)&&!n(34)(function(){return 7!=Object.defineProperty(n(35)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){t.exports=!n(34)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},function(t,e,n){var r=n(31),o=n(20).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(31);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){t.exports={"default":n(39),__esModule:!0}},function(t,e,n){n(40),n(41),n(54),n(58),t.exports=n(25).Promise},function(t,e){},function(t,e,n){"use strict";var r=n(42)(!0);n(43)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(16),o=n(7);t.exports=function(t){return function(e,n){var i,u,f=String(o(e)),c=r(n),s=f.length;return c<0||c>=s?t?"":void 0:(i=f.charCodeAt(c),i<55296||i>56319||c+1===s||(u=f.charCodeAt(c+1))<56320||u>57343?t?f.charAt(c):i:t?f.slice(c,c+2):(i-55296<<10)+(u-56320)+65536)}}},function(t,e,n){"use strict";var r=n(44),o=n(24),i=n(45),u=n(28),f=n(10),c=n(46),s=n(47),a=n(51),l=n(53),d=n(52)("iterator"),p=!([].keys&&"next"in[].keys()),v="@@iterator",y="keys",h="values",m=function(){return this};t.exports=function(t,e,n,g,_,b,x){s(n,e,g);var w,O,j,k=function(t){if(!p&&t in $)return $[t];switch(t){case y:return function(){return new n(this,t)};case h:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",M=_==h,E=!1,$=t.prototype,P=$[d]||$[v]||_&&$[_],T=P||k(_),F=_?M?k("entries"):T:void 0,A="Array"==e?$.entries||P:P;if(A&&(j=l(A.call(new t)),j!==Object.prototype&&(a(j,S,!0),r||f(j,d)||u(j,d,m))),M&&P&&P.name!==h&&(E=!0,T=function(){return P.call(this)}),r&&!x||!p&&!E&&$[d]||u($,d,T),c[e]=T,c[S]=m,_)if(w={values:M?T:k(h),keys:b?T:k(y),entries:F},x)for(O in w)O in $||i($,O,w[O]);else o(o.P+o.F*(p||E),e,w);return w}},function(t,e){t.exports=!0},function(t,e,n){t.exports=n(28)},function(t,e){t.exports={}},function(t,e,n){"use strict";var r=n(48),o=n(37),i=n(51),u={};n(28)(u,n(52)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(u,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){var r=n(30),o=n(49),i=n(22),u=n(18)("IE_PROTO"),f=function(){},c="prototype",s=function(){var t,e=n(35)("iframe"),r=i.length,o="<",u=">";for(e.style.display="none",n(50).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(o+"script"+u+"document.F=Object"+o+"/script"+u),t.close(),s=t.F;r--;)delete s[c][i[r]];return s()};t.exports=Object.create||function(t,e){var n;return null!==t?(f[c]=r(t),n=new f,f[c]=null,n[u]=t):n=s(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(29),o=n(30),i=n(8);t.exports=n(33)?Object.defineProperties:function(t,e){o(t);for(var n,u=i(e),f=u.length,c=0;f>c;)r.f(t,n=u[c++],e[n]);return t}},function(t,e,n){t.exports=n(20).document&&document.documentElement},function(t,e,n){var r=n(29).f,o=n(10),i=n(52)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(19)("wks"),o=n(21),i=n(20).Symbol,u="function"==typeof i,f=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};f.store=r},function(t,e,n){var r=n(10),o=n(6),i=n(18)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,e,n){n(55);for(var r=n(20),o=n(28),i=n(46),u=n(52)("toStringTag"),f=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var s=f[c],a=r[s],l=a&&a.prototype;l&&!l[u]&&o(l,u,s),i[s]=i.Array}},function(t,e,n){"use strict";var r=n(56),o=n(57),i=n(46),u=n(11);t.exports=n(43)(Array,"Array",function(t,e){this._t=u(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):"keys"==e?o(0,n):"values"==e?o(0,t[n]):o(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){"use strict";var r,o,i,u=n(44),f=n(20),c=n(26),s=n(59),a=n(24),l=n(31),d=n(27),p=n(60),v=n(61),y=n(65),h=n(66).set,m=n(68)(),g="Promise",_=f.TypeError,b=f.process,x=f[g],b=f.process,w="process"==s(b),O=function(){},j=!!function(){try{var t=x.resolve(1),e=(t.constructor={})[n(52)("species")]=function(t){t(O,O)};return(w||"function"==typeof PromiseRejectionEvent)&&t.then(O)instanceof e}catch(r){}}(),k=function(t,e){return t===e||t===x&&e===i},S=function(t){var e;return!(!l(t)||"function"!=typeof(e=t.then))&&e},M=function(t){return k(x,t)?new E(t):new o(t)},E=o=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw _("Bad Promise constructor");e=t,n=r}),this.resolve=d(e),this.reject=d(n)},$=function(t){try{t()}catch(e){return{error:e}}},P=function(t,e){if(!t._n){t._n=!0;var n=t._c;m(function(){for(var r=t._v,o=1==t._s,i=0,u=function(e){var n,i,u=o?e.ok:e.fail,f=e.resolve,c=e.reject,s=e.domain;try{u?(o||(2==t._h&&A(t),t._h=1),u===!0?n=r:(s&&s.enter(),n=u(r),s&&s.exit()),n===e.promise?c(_("Promise-chain cycle")):(i=S(n))?i.call(n,f,c):f(n)):c(r)}catch(a){c(a)}};n.length>i;)u(n[i++]);t._c=[],t._n=!1,e&&!t._h&&T(t)})}},T=function(t){h.call(f,function(){var e,n,r,o=t._v;if(F(t)&&(e=$(function(){w?b.emit("unhandledRejection",o,t):(n=f.onunhandledrejection)?n({promise:t,reason:o}):(r=f.console)&&r.error&&r.error("Unhandled promise rejection",o)}),t._h=w||F(t)?2:1),t._a=void 0,e)throw e.error})},F=function(t){if(1==t._h)return!1;for(var e,n=t._a||t._c,r=0;n.length>r;)if(e=n[r++],e.fail||!F(e.promise))return!1;return!0},A=function(t){h.call(f,function(){var e;w?b.emit("rejectionHandled",t):(e=f.onrejectionhandled)&&e({promise:t,reason:t._v})})},I=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),P(e,!0))},N=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw _("Promise can't be resolved itself");(e=S(t))?m(function(){var r={_w:n,_d:!1};try{e.call(t,c(N,r,1),c(I,r,1))}catch(o){I.call(r,o)}}):(n._v=t,n._s=1,P(n,!1))}catch(r){I.call({_w:n,_d:!1},r)}}};j||(x=function(t){p(this,x,g,"_h"),d(t),r.call(this);try{t(c(N,this,1),c(I,this,1))}catch(e){I.call(this,e)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(69)(x.prototype,{then:function(t,e){var n=M(y(this,x));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=w?b.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&P(this,!1),n.promise},"catch":function(t){return this.then(void 0,t)}}),E=function(){var t=new r;this.promise=t,this.resolve=c(N,t,1),this.reject=c(I,t,1)}),a(a.G+a.W+a.F*!j,{Promise:x}),n(51)(x,g),n(70)(g),i=n(25)[g],a(a.S+a.F*!j,g,{reject:function(t){var e=M(this),n=e.reject;return n(t),e.promise}}),a(a.S+a.F*(u||!j),g,{resolve:function(t){if(t instanceof x&&k(t.constructor,this))return t;var e=M(this),n=e.resolve;return n(t),e.promise}}),a(a.S+a.F*!(j&&n(71)(function(t){x.all(t)["catch"](O)})),g,{all:function(t){var e=this,n=M(e),r=n.resolve,o=n.reject,i=$(function(){var n=[],i=0,u=1;v(t,!1,function(t){var f=i++,c=!1;n.push(void 0),u++,e.resolve(t).then(function(t){c||(c=!0,n[f]=t,--u||r(n))},o)}),--u||r(n)});return i&&o(i.error),n.promise},race:function(t){var e=this,n=M(e),r=n.reject,o=$(function(){v(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return o&&r(o.error),n.promise}})},function(t,e,n){var r=n(13),o=n(52)("toStringTag"),i="Arguments"==r(function(){return arguments}()),u=function(t,e){try{return t[e]}catch(n){}};t.exports=function(t){var e,n,f;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=u(e=Object(t),o))?n:i?r(e):"Object"==(f=r(e))&&"function"==typeof e.callee?"Arguments":f}},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(26),o=n(62),i=n(63),u=n(30),f=n(15),c=n(64),s={},a={},e=t.exports=function(t,e,n,l,d){var p,v,y,h,m=d?function(){return t}:c(t),g=r(n,l,e?2:1),_=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(i(m)){for(p=f(t.length);p>_;_++)if(h=e?g(u(v=t[_])[0],v[1]):g(t[_]),h===s||h===a)return h}else for(y=m.call(t);!(v=y.next()).done;)if(h=o(y,g,v.value,e),h===s||h===a)return h};e.BREAK=s,e.RETURN=a},function(t,e,n){var r=n(30);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(i){var u=t["return"];throw void 0!==u&&r(u.call(t)),i}}},function(t,e,n){var r=n(46),o=n(52)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){var r=n(59),o=n(52)("iterator"),i=n(46);t.exports=n(25).getIteratorMethod=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(30),o=n(27),i=n(52)("species");t.exports=function(t,e){var n,u=r(t).constructor;return void 0===u||void 0==(n=r(u)[i])?e:o(n)}},function(t,e,n){var r,o,i,u=n(26),f=n(67),c=n(50),s=n(35),a=n(20),l=a.process,d=a.setImmediate,p=a.clearImmediate,v=a.MessageChannel,y=0,h={},m="onreadystatechange",g=function(){var t=+this;if(h.hasOwnProperty(t)){var e=h[t];delete h[t],e()}},_=function(t){g.call(t.data)};d&&p||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return h[++y]=function(){f("function"==typeof t?t:Function(t),e)},r(y),y},p=function(t){delete h[t]},"process"==n(13)(l)?r=function(t){l.nextTick(u(g,t,1))}:v?(o=new v,i=o.port2,o.port1.onmessage=_,r=u(i.postMessage,i,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts?(r=function(t){a.postMessage(t+"","*")},a.addEventListener("message",_,!1)):r=m in s("script")?function(t){c.appendChild(s("script"))[m]=function(){c.removeChild(this),g.call(t)}}:function(t){setTimeout(u(g,t,1),0)}),t.exports={set:d,clear:p}},function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){var r=n(20),o=n(66).set,i=r.MutationObserver||r.WebKitMutationObserver,u=r.process,f=r.Promise,c="process"==n(13)(u);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=u.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(i){throw t?n():e=void 0,i}}e=void 0,r&&r.enter()};if(c)n=function(){u.nextTick(s)};else if(i){var a=!0,l=document.createTextNode("");new i(s).observe(l,{characterData:!0}),n=function(){l.data=a=!a}}else if(f&&f.resolve){var d=f.resolve();n=function(){d.then(s)}}else n=function(){o.call(r,s)};return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e,n){var r=n(28);t.exports=function(t,e,n){for(var o in e)n&&t[o]?t[o]=e[o]:r(t,o,e[o]);return t}},function(t,e,n){"use strict";var r=n(20),o=n(25),i=n(29),u=n(33),f=n(52)("species");t.exports=function(t){var e="function"==typeof o[t]?o[t]:r[t];u&&e&&!e[f]&&i.f(e,f,{configurable:!0,get:function(){return this}})}},function(t,e,n){var r=n(52)("iterator"),o=!1;try{var i=[7][r]();i["return"]=function(){o=!0},Array.from(i,function(){throw 2})}catch(u){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],u=i[r]();u.next=function(){return{done:n=!0}},i[r]=function(){return u},t(i)}catch(f){}return n}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),i=r(o),u=n(38),f=r(u),c=n(73),s=r(c),a=n(92);r(a);e["default"]={render:function(t){if(this.display)return t(this.type,{props:{form:this.form,field:this.field,model:this.model,to:this.templateOptions}})},props:["form","model","field","to"],computed:{templateOptions:function(){return this.field.templateOptions||{}},type:function(){return"formly_"+this.field.type},display:function(){var t=(0,s["default"])(this.field.display);if("function"!==t&&"string"!==t)return!0;if("function"===t)return this.field.display(this.field,this.model);var e=new Function("field","model","return "+this.field.display+";");return e.call({},this.field,this.model)}},methods:{validate:function(){var t=this;return new f["default"](function(e,n){t.form.$errors[t.field.key]||t.$set(t.form.$errors,t.field.key,{}),t.field.templateOptions||t.$set(t.field,"templateOptions",{});var r="templateOptions"in t.field&&"label"in t.field.templateOptions?t.field.templateOptions.label:"";if(!t.display)return t.$set(t.form.$errors,t.field.key,{}),e();if(t.field.required){t.form.$errors[t.field.key].required||t.$set(t.form.$errors[t.field.key],"required",!0);var o=(0,a.parseValidationString)("required",!1,r,t.model[t.field.key]),u="string"==typeof t.model[t.field.key]?!t.model[t.field.key]:null===t.model[t.field.key]||void 0===t.model[t.field.key]||0===t.model[t.field.key].length,f=!!t.display&&u;(0,a.setError)(t.form,t.field.key,"required",f,o)}if(!t.field.validators)return e();var c=t.model,l=t.field;(0,i["default"])(t.field.validators).forEach(function(n){if(t.form.$errors[t.field.key][n]||t.$set(t.form.$errors[t.field.key],n,!1),t.field.required===!1&&!t.model[t.field.key])return(0,a.setError)(t.form,t.field.key,n,!1),e();var o=t.field.validators[n],i=!1;"object"===("undefined"==typeof o?"undefined":(0,s["default"])(o))&&("message"in o?(i=o.message,o=o.expression):console.error("Looks like you've set a validator object without setting a message. If you don't need to explicity set the message just define the validator as either an expression or a function. Refer to the docs for more info")),i=(0,a.parseValidationString)(n,i,r,c[t.field.key]);var u=!1;if("function"==typeof o){var f="$async_"+n;t.$set(t.form.$errors[t.field.key],f,!0),o(l,c,function(){var r=arguments.length>0&&void 0!==arguments[0]&&arguments[0],o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i;(0,a.setError)(t.form,t.field.key,n,!r,o),t.$set(t.form.$errors[t.field.key],f,!1),e()})}else{var d=new Function("model","field","return "+o+";");u=!d.call({},c,l),(0,a.setError)(t.form,t.field.key,n,u,i),e()}})})}},components:(0,a.getTypes)(),created:function(){var t=this;this.validate(),this.$watch("model",function(e){t.validate()},{deep:!0})},mounted:function(){if(this.field.wrapper){var t=document.createElement("DIV");t.innerHTML=this.field.wrapper;var e=this.$el.parentNode;e.insertBefore(t,this.$el),t.firstChild.appendChild(this.$el),e.insertBefore(t.firstChild,t),e.removeChild(t)}}}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var o=n(74),i=r(o),u=n(77),f=r(u),c="function"==typeof f["default"]&&"symbol"==typeof i["default"]?function(t){return typeof t}:function(t){return t&&"function"==typeof f["default"]&&t.constructor===f["default"]&&t!==f["default"].prototype?"symbol":typeof t};e["default"]="function"==typeof f["default"]&&"symbol"===c(i["default"])?function(t){return"undefined"==typeof t?"undefined":c(t)}:function(t){return t&&"function"==typeof f["default"]&&t.constructor===f["default"]&&t!==f["default"].prototype?"symbol":"undefined"==typeof t?"undefined":c(t)}},function(t,e,n){t.exports={"default":n(75),__esModule:!0}},function(t,e,n){n(41),n(54),t.exports=n(76).f("iterator")},function(t,e,n){e.f=n(52)},function(t,e,n){t.exports={"default":n(78),__esModule:!0}},function(t,e,n){n(79),n(40),n(90),n(91),t.exports=n(25).Symbol},function(t,e,n){"use strict";var r=n(20),o=n(10),i=n(33),u=n(24),f=n(45),c=n(80).KEY,s=n(34),a=n(19),l=n(51),d=n(21),p=n(52),v=n(76),y=n(81),h=n(82),m=n(83),g=n(86),_=n(30),b=n(11),x=n(36),w=n(37),O=n(48),j=n(87),k=n(89),S=n(29),M=n(8),E=k.f,$=S.f,P=j.f,T=r.Symbol,F=r.JSON,A=F&&F.stringify,I="prototype",N=p("_hidden"),V=p("toPrimitive"),C={}.propertyIsEnumerable,L=a("symbol-registry"),R=a("symbols"),W=a("op-symbols"),D=Object[I],q="function"==typeof T,B=r.QObject,G=!B||!B[I]||!B[I].findChild,K=i&&s(function(){return 7!=O($({},"a",{get:function(){return $(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=E(D,e);r&&delete D[e],$(t,e,n),r&&t!==D&&$(D,e,r)}:$,J=function(t){var e=R[t]=O(T[I]);return e._k=t,e},U=q&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},z=function(t,e,n){return t===D&&z(W,e,n),_(t),e=x(e,!0),_(n),o(R,e)?(n.enumerable?(o(t,N)&&t[N][e]&&(t[N][e]=!1),n=O(n,{enumerable:w(0,!1)})):(o(t,N)||$(t,N,w(1,{})),t[N][e]=!0),K(t,e,n)):$(t,e,n)},H=function(t,e){_(t);for(var n,r=m(e=b(e)),o=0,i=r.length;i>o;)z(t,n=r[o++],e[n]);return t},Y=function(t,e){return void 0===e?O(t):H(O(t),e)},Q=function(t){var e=C.call(this,t=x(t,!0));return!(this===D&&o(R,t)&&!o(W,t))&&(!(e||!o(this,t)||!o(R,t)||o(this,N)&&this[N][t])||e)},X=function(t,e){if(t=b(t),e=x(e,!0),t!==D||!o(R,e)||o(W,e)){var n=E(t,e);return!n||!o(R,e)||o(t,N)&&t[N][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=P(b(t)),r=[],i=0;n.length>i;)o(R,e=n[i++])||e==N||e==c||r.push(e);return r},tt=function(t){for(var e,n=t===D,r=P(n?W:b(t)),i=[],u=0;r.length>u;)!o(R,e=r[u++])||n&&!o(D,e)||i.push(R[e]);return i};q||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(n){this===D&&e.call(W,n),o(this,N)&&o(this[N],t)&&(this[N][t]=!1),K(this,t,w(1,n))};return i&&G&&K(D,t,{configurable:!0,set:e}),J(t)},f(T[I],"toString",function(){return this._k}),k.f=X,S.f=z,n(88).f=j.f=Z,n(85).f=Q,n(84).f=tt,i&&!n(44)&&f(D,"propertyIsEnumerable",Q,!0),v.f=function(t){return J(p(t))}),u(u.G+u.W+u.F*!q,{Symbol:T});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)p(et[nt++]);for(var et=M(p.store),nt=0;et.length>nt;)y(et[nt++]);u(u.S+u.F*!q,"Symbol",{"for":function(t){return o(L,t+="")?L[t]:L[t]=T(t)},keyFor:function(t){if(U(t))return h(L,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){G=!0},useSimple:function(){G=!1}}),u(u.S+u.F*!q,"Object",{create:Y,defineProperty:z,defineProperties:H,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),F&&u(u.S+u.F*(!q||s(function(){var t=T();return"[null]"!=A([t])||"{}"!=A({a:t})||"{}"!=A(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!U(t)){for(var e,n,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);return e=r[1],"function"==typeof e&&(n=e),!n&&g(e)||(e=function(t,e){if(n&&(e=n.call(this,t,e)),!U(e))return e}),r[1]=e,A.apply(F,r)}}}),T[I][V]||n(28)(T[I],V,T[I].valueOf),l(T,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,e,n){var r=n(21)("meta"),o=n(31),i=n(10),u=n(29).f,f=0,c=Object.isExtensible||function(){return!0},s=!n(34)(function(){return c(Object.preventExtensions({}))}),a=function(t){u(t,r,{value:{i:"O"+ ++f,w:{}}})},l=function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";a(t)}return t[r].i},d=function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;a(t)}return t[r].w},p=function(t){return s&&v.NEED&&c(t)&&!i(t,r)&&a(t),t},v=t.exports={KEY:r,NEED:!1,fastKey:l,getWeak:d,onFreeze:p}},function(t,e,n){var r=n(20),o=n(25),i=n(44),u=n(76),f=n(29).f;t.exports=function(t){var e=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||f(e,t,{value:u.f(t)})}},function(t,e,n){var r=n(8),o=n(11);t.exports=function(t,e){for(var n,i=o(t),u=r(i),f=u.length,c=0;f>c;)if(i[n=u[c++]]===e)return n}},function(t,e,n){var r=n(8),o=n(84),i=n(85);t.exports=function(t){var e=r(t),n=o.f;if(n)for(var u,f=n(t),c=i.f,s=0;f.length>s;)c.call(t,u=f[s++])&&e.push(u);return e}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(13);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(11),o=n(88).f,i={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(t){try{return o(t)}catch(e){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==i.call(t)?f(t):o(r(t))}},function(t,e,n){var r=n(9),o=n(22).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){var r=n(85),o=n(37),i=n(11),u=n(36),f=n(10),c=n(32),s=Object.getOwnPropertyDescriptor;e.f=n(33)?s:function(t,e){if(t=i(t),e=u(e,!0),c)try{return s(t,e)}catch(n){}if(f(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){n(81)("asyncIterator")},function(t,e,n){n(81)("observable")},function(t,e){"use strict";function n(t,e){a.formlyFields["formly_"+t]=e}function r(){return a.formlyFields}function o(t,e,n){if(u(t,e)){var r=e.split("."),o=r.pop(),i=r.reduce(function(t,e){return t[e]},t);this.$set(i,o,n)}else this.$set(t,e,n)}function i(t,e){var n=u(t,e,!0);return null===n?t[e]:n}function u(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e)return!1;e=e.replace(/^\./,"");for(var r=e.split("."),o=0;o4&&void 0!==arguments[4]&&arguments[4];t.$errors[e]||(t.$errors[e]={}),t.$errors[e][n]=!!r&&(o||r)}function c(t,e){a.validationMessages[t]=e}function s(t,e,n,r){if(t&&!(t in a.validationMessages)&&!e)return!1;t in a.validationMessages&&(e=a.validationMessages[t]);var o=e.replace(/\%l/g,n).replace(/\%v/g,r);return o}Object.defineProperty(e,"__esModule",{value:!0}),e.addType=n,e.getTypes=r,e.set=o,e.get=i,e.setError=f,e.addValidationMessage=c,e.parseValidationString=s;var a={formlyFields:{},validationMessages:{}};e["default"]=a},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),i=r(o);e["default"]=function(t){t.filter("formlyFields",function(t){var e=/^\$/,n=(0,i["default"])(t).filter(function(t){return!e.test(t)});return n})}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),i=r(o);e["default"]=function(t){t.directive("formly-atts",{bind:function(t,e){e.value&&(0,i["default"])(e.value).forEach(function(n){t.setAttribute(n,e.value[n])})}}),t.directive("formly-input-type",{bind:function(t,e){e.value&&t.setAttribute("type",e.value)}})}}])}); -------------------------------------------------------------------------------- /dist/vue-formly.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-formly v2.5.9 3 | * https://github.com/matt-sanders/vue-formly 4 | * Released under the MIT License. 5 | */ 6 | 7 | (function webpackUniversalModuleDefinition(root,factory){if(typeof exports==="object"&&typeof module==="object")module.exports=factory();else if(typeof define==="function"&&define.amd)define([],factory);else if(typeof exports==="object")exports["VueFormly"]=factory();else root["VueFormly"]=factory()})(this,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:false};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.loaded=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.p="";return __webpack_require__(0)}([function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _index=__webpack_require__(1);var _index2=_interopRequireDefault(_index);var _index3=__webpack_require__(93);var _index4=_interopRequireDefault(_index3);var _util=__webpack_require__(92);var _util2=_interopRequireDefault(_util);var _index5=__webpack_require__(94);var _index6=_interopRequireDefault(_index5);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}var Formly={getTypes:_util.getTypes,addType:_util.addType,addValidationMessage:_util.addValidationMessage,install:function install(Vue,options){(0,_index6.default)(Vue);(0,_index2.default)(Vue);(0,_index4.default)(Vue);Vue.$formly={getTypes:_util.getTypes,addType:_util.addType,addValidationMessage:_util.addValidationMessage};Vue.prototype.$formlySet=_util.set;Vue.prototype.$formlyGet=_util.get}};if(typeof window!=="undefined"&&window.Vue){window.Vue.use(Formly);window.Vue.$formly={getTypes:_util.getTypes,addType:_util.addType,addValidationMessage:_util.addValidationMessage}}exports.default=Formly},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=function(Vue){Vue.component("formly-form",_FormlyForm2.default);Vue.component("formly-field",function(resolve){resolve(_FormlyField2.default)})};var _FormlyForm=__webpack_require__(2);var _FormlyForm2=_interopRequireDefault(_FormlyForm);var _FormlyField=__webpack_require__(72);var _FormlyField2=_interopRequireDefault(_FormlyField);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _keys=__webpack_require__(3);var _keys2=_interopRequireDefault(_keys);var _promise=__webpack_require__(38);var _promise2=_interopRequireDefault(_promise);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}exports.default={render:function render(h){var children=[];if(!this.customLayout){var self=this;children=this.fields.map(function(field){return h("formly-field",{key:"formly_"+field.key,ref:field.key,props:{model:self.model,form:self.form,field:field}})})}if("default"in this.$scopedSlots)children.push(this.$scopedSlots.default({keys:this.keys}));return h(this.tag?this.tag:"fieldset",children)},methods:{validate:function validate(){var _this=this;return new _promise2.default(function(resolve,reject){var target=_this.fields.length;var count=0;_this.fields.forEach(function(field){if(!(field.key in _this.form)){count++;if(target==count)resolve();return}_this.$set(_this.form[field.key],"$dirty",true);var validate=void 0;if(field.key in _this.$refs){validate=_this.$refs[field.key].validate}else{_this.$children.some(function(child){if(!("field"in child))return false;if(child.field.key===field.key){validate=child.validate;return true}})}if(typeof validate!=="function"){count++;if(target==count)resolve();return}validate().then(function(){count++;if(target==count)resolve()}).catch(function(e){reject(e)})})})}},props:["form","model","fields","customLayout","tag"],computed:{keys:function keys(){var keys={};this.fields.forEach(function(field){keys[field.key]=field});return keys}},created:function created(){var _this2=this;this.fields.forEach(function(field){if(typeof _this2.model[field.key]=="undefined")_this2.$set(_this2.model,field.key,"")});this.$set(this.form,"$errors",{});this.$set(this.form,"$valid",true);this.$watch("form.$errors",function(val){var _this3=this;var valid=true;(0,_keys2.default)(this.form.$errors).forEach(function(key){var errField=_this3.form.$errors[key];(0,_keys2.default)(errField).forEach(function(errKey){if(errField[errKey])valid=false})});this.form.$valid=valid},{deep:true})}}},function(module,exports,__webpack_require__){module.exports={"default":__webpack_require__(4),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(5);module.exports=__webpack_require__(25).Object.keys},function(module,exports,__webpack_require__){var toObject=__webpack_require__(6),$keys=__webpack_require__(8);__webpack_require__(23)("keys",function(){return function keys(it){return $keys(toObject(it))}})},function(module,exports,__webpack_require__){var defined=__webpack_require__(7);module.exports=function(it){return Object(defined(it))}},function(module,exports){module.exports=function(it){if(it==undefined)throw TypeError("Can't call method on "+it);return it}},function(module,exports,__webpack_require__){var $keys=__webpack_require__(9),enumBugKeys=__webpack_require__(22);module.exports=Object.keys||function keys(O){return $keys(O,enumBugKeys)}},function(module,exports,__webpack_require__){var has=__webpack_require__(10),toIObject=__webpack_require__(11),arrayIndexOf=__webpack_require__(14)(false),IE_PROTO=__webpack_require__(18)("IE_PROTO");module.exports=function(object,names){var O=toIObject(object),i=0,result=[],key;for(key in O)if(key!=IE_PROTO)has(O,key)&&result.push(key);while(names.length>i)if(has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key)}return result}},function(module,exports){var hasOwnProperty={}.hasOwnProperty;module.exports=function(it,key){return hasOwnProperty.call(it,key)}},function(module,exports,__webpack_require__){var IObject=__webpack_require__(12),defined=__webpack_require__(7);module.exports=function(it){return IObject(defined(it))}},function(module,exports,__webpack_require__){var cof=__webpack_require__(13);module.exports=Object("z").propertyIsEnumerable(0)?Object:function(it){return cof(it)=="String"?it.split(""):Object(it)}},function(module,exports){var toString={}.toString;module.exports=function(it){return toString.call(it).slice(8,-1)}},function(module,exports,__webpack_require__){var toIObject=__webpack_require__(11),toLength=__webpack_require__(15),toIndex=__webpack_require__(17);module.exports=function(IS_INCLUDES){return function($this,el,fromIndex){var O=toIObject($this),length=toLength(O.length),index=toIndex(fromIndex,length),value;if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];if(value!=value)return true}else for(;length>index;index++)if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0}return!IS_INCLUDES&&-1}}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(16),min=Math.min;module.exports=function(it){return it>0?min(toInteger(it),9007199254740991):0}},function(module,exports){var ceil=Math.ceil,floor=Math.floor;module.exports=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it)}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(16),max=Math.max,min=Math.min;module.exports=function(index,length){index=toInteger(index);return index<0?max(index+length,0):min(index,length)}},function(module,exports,__webpack_require__){var shared=__webpack_require__(19)("keys"),uid=__webpack_require__(21);module.exports=function(key){return shared[key]||(shared[key]=uid(key))}},function(module,exports,__webpack_require__){var global=__webpack_require__(20),SHARED="__core-js_shared__",store=global[SHARED]||(global[SHARED]={});module.exports=function(key){return store[key]||(store[key]={})}},function(module,exports){var global=module.exports=typeof window!="undefined"&&window.Math==Math?window:typeof self!="undefined"&&self.Math==Math?self:Function("return this")();if(typeof __g=="number")__g=global},function(module,exports){var id=0,px=Math.random();module.exports=function(key){return"Symbol(".concat(key===undefined?"":key,")_",(++id+px).toString(36))}},function(module,exports){module.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(module,exports,__webpack_require__){var $export=__webpack_require__(24),core=__webpack_require__(25),fails=__webpack_require__(34);module.exports=function(KEY,exec){var fn=(core.Object||{})[KEY]||Object[KEY],exp={};exp[KEY]=exec(fn);$export($export.S+$export.F*fails(function(){fn(1)}),"Object",exp)}},function(module,exports,__webpack_require__){var global=__webpack_require__(20),core=__webpack_require__(25),ctx=__webpack_require__(26),hide=__webpack_require__(28),PROTOTYPE="prototype";var $export=function(type,name,source){var IS_FORCED=type&$export.F,IS_GLOBAL=type&$export.G,IS_STATIC=type&$export.S,IS_PROTO=type&$export.P,IS_BIND=type&$export.B,IS_WRAP=type&$export.W,exports=IS_GLOBAL?core:core[name]||(core[name]={}),expProto=exports[PROTOTYPE],target=IS_GLOBAL?global:IS_STATIC?global[name]:(global[name]||{})[PROTOTYPE],key,own,out;if(IS_GLOBAL)source=name;for(key in source){own=!IS_FORCED&&target&&target[key]!==undefined;if(own&&key in exports)continue;out=own?target[key]:source[key];exports[key]=IS_GLOBAL&&typeof target[key]!="function"?source[key]:IS_BIND&&own?ctx(out,global):IS_WRAP&&target[key]==out?function(C){var F=function(a,b,c){if(this instanceof C){switch(arguments.length){case 0:return new C;case 1:return new C(a);case 2:return new C(a,b)}return new C(a,b,c)}return C.apply(this,arguments)};F[PROTOTYPE]=C[PROTOTYPE];return F}(out):IS_PROTO&&typeof out=="function"?ctx(Function.call,out):out;if(IS_PROTO){(exports.virtual||(exports.virtual={}))[key]=out;if(type&$export.R&&expProto&&!expProto[key])hide(expProto,key,out)}}};$export.F=1;$export.G=2;$export.S=4;$export.P=8;$export.B=16;$export.W=32;$export.U=64;$export.R=128;module.exports=$export},function(module,exports){var core=module.exports={version:"2.4.0"};if(typeof __e=="number")__e=core},function(module,exports,__webpack_require__){var aFunction=__webpack_require__(27);module.exports=function(fn,that,length){aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}}},function(module,exports){module.exports=function(it){if(typeof it!="function")throw TypeError(it+" is not a function!");return it}},function(module,exports,__webpack_require__){var dP=__webpack_require__(29),createDesc=__webpack_require__(37);module.exports=__webpack_require__(33)?function(object,key,value){return dP.f(object,key,createDesc(1,value))}:function(object,key,value){object[key]=value;return object}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(30),IE8_DOM_DEFINE=__webpack_require__(32),toPrimitive=__webpack_require__(36),dP=Object.defineProperty;exports.f=__webpack_require__(33)?Object.defineProperty:function defineProperty(O,P,Attributes){anObject(O);P=toPrimitive(P,true);anObject(Attributes);if(IE8_DOM_DEFINE)try{return dP(O,P,Attributes)}catch(e){}if("get"in Attributes||"set"in Attributes)throw TypeError("Accessors not supported!");if("value"in Attributes)O[P]=Attributes.value;return O}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(31);module.exports=function(it){if(!isObject(it))throw TypeError(it+" is not an object!");return it}},function(module,exports){module.exports=function(it){return typeof it==="object"?it!==null:typeof it==="function"}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(33)&&!__webpack_require__(34)(function(){return Object.defineProperty(__webpack_require__(35)("div"),"a",{get:function(){return 7}}).a!=7})},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(34)(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7})},function(module,exports){module.exports=function(exec){try{return!!exec()}catch(e){return true}}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(31),document=__webpack_require__(20).document,is=isObject(document)&&isObject(document.createElement);module.exports=function(it){return is?document.createElement(it):{}}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(31);module.exports=function(it,S){if(!isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)=="function"&&!isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)=="function"&&!isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)=="function"&&!isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value")}},function(module,exports){module.exports=function(bitmap,value){return{enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value}}},function(module,exports,__webpack_require__){module.exports={"default":__webpack_require__(39),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(40);__webpack_require__(41);__webpack_require__(54);__webpack_require__(58);module.exports=__webpack_require__(25).Promise},function(module,exports){},function(module,exports,__webpack_require__){"use strict";var $at=__webpack_require__(42)(true);__webpack_require__(43)(String,"String",function(iterated){this._t=String(iterated);this._i=0},function(){var O=this._t,index=this._i,point;if(index>=O.length)return{value:undefined,done:true};point=$at(O,index);this._i+=point.length;return{value:point,done:false}})},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(16),defined=__webpack_require__(7);module.exports=function(TO_STRING){return function(that,pos){var s=String(defined(that)),i=toInteger(pos),l=s.length,a,b;if(i<0||i>=l)return TO_STRING?"":undefined;a=s.charCodeAt(i);return a<55296||a>56319||i+1===l||(b=s.charCodeAt(i+1))<56320||b>57343?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-55296<<10)+(b-56320)+65536}}},function(module,exports,__webpack_require__){"use strict";var LIBRARY=__webpack_require__(44),$export=__webpack_require__(24),redefine=__webpack_require__(45),hide=__webpack_require__(28),has=__webpack_require__(10),Iterators=__webpack_require__(46),$iterCreate=__webpack_require__(47),setToStringTag=__webpack_require__(51),getPrototypeOf=__webpack_require__(53),ITERATOR=__webpack_require__(52)("iterator"),BUGGY=!([].keys&&"next"in[].keys()),FF_ITERATOR="@@iterator",KEYS="keys",VALUES="values";var returnThis=function(){return this};module.exports=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){$iterCreate(Constructor,NAME,next);var getMethod=function(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind)};case VALUES:return function values(){return new Constructor(this,kind)}}return function entries(){return new Constructor(this,kind)}};var TAG=NAME+" Iterator",DEF_VALUES=DEFAULT==VALUES,VALUES_BUG=false,proto=Base.prototype,$native=proto[ITERATOR]||proto[FF_ITERATOR]||DEFAULT&&proto[DEFAULT],$default=$native||getMethod(DEFAULT),$entries=DEFAULT?!DEF_VALUES?$default:getMethod("entries"):undefined,$anyNative=NAME=="Array"?proto.entries||$native:$native,methods,key,IteratorPrototype;if($anyNative){IteratorPrototype=getPrototypeOf($anyNative.call(new Base));if(IteratorPrototype!==Object.prototype){setToStringTag(IteratorPrototype,TAG,true);if(!LIBRARY&&!has(IteratorPrototype,ITERATOR))hide(IteratorPrototype,ITERATOR,returnThis)}}if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this)}}if((!LIBRARY||FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){hide(proto,ITERATOR,$default)}Iterators[NAME]=$default;Iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))redefine(proto,key,methods[key])}else $export($export.P+$export.F*(BUGGY||VALUES_BUG),NAME,methods)}return methods}},function(module,exports){module.exports=true},function(module,exports,__webpack_require__){module.exports=__webpack_require__(28)},function(module,exports){module.exports={}},function(module,exports,__webpack_require__){"use strict";var create=__webpack_require__(48),descriptor=__webpack_require__(37),setToStringTag=__webpack_require__(51),IteratorPrototype={};__webpack_require__(28)(IteratorPrototype,__webpack_require__(52)("iterator"),function(){return this});module.exports=function(Constructor,NAME,next){Constructor.prototype=create(IteratorPrototype,{next:descriptor(1,next)});setToStringTag(Constructor,NAME+" Iterator")}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(30),dPs=__webpack_require__(49),enumBugKeys=__webpack_require__(22),IE_PROTO=__webpack_require__(18)("IE_PROTO"),Empty=function(){},PROTOTYPE="prototype";var createDict=function(){var iframe=__webpack_require__(35)("iframe"),i=enumBugKeys.length,lt="<",gt=">",iframeDocument;iframe.style.display="none";__webpack_require__(50).appendChild(iframe);iframe.src="javascript:";iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+"script"+gt+"document.F=Object"+lt+"/script"+gt);iframeDocument.close();createDict=iframeDocument.F;while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];return createDict()};module.exports=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE]=anObject(O);result=new Empty;Empty[PROTOTYPE]=null;result[IE_PROTO]=O}else result=createDict();return Properties===undefined?result:dPs(result,Properties)}},function(module,exports,__webpack_require__){var dP=__webpack_require__(29),anObject=__webpack_require__(30),getKeys=__webpack_require__(8);module.exports=__webpack_require__(33)?Object.defineProperties:function defineProperties(O,Properties){anObject(O);var keys=getKeys(Properties),length=keys.length,i=0,P;while(length>i)dP.f(O,P=keys[i++],Properties[P]);return O}},function(module,exports,__webpack_require__){module.exports=__webpack_require__(20).document&&document.documentElement},function(module,exports,__webpack_require__){var def=__webpack_require__(29).f,has=__webpack_require__(10),TAG=__webpack_require__(52)("toStringTag");module.exports=function(it,tag,stat){if(it&&!has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag})}},function(module,exports,__webpack_require__){var store=__webpack_require__(19)("wks"),uid=__webpack_require__(21),Symbol=__webpack_require__(20).Symbol,USE_SYMBOL=typeof Symbol=="function";var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&Symbol[name]||(USE_SYMBOL?Symbol:uid)("Symbol."+name))};$exports.store=store},function(module,exports,__webpack_require__){var has=__webpack_require__(10),toObject=__webpack_require__(6),IE_PROTO=__webpack_require__(18)("IE_PROTO"),ObjectProto=Object.prototype;module.exports=Object.getPrototypeOf||function(O){O=toObject(O);if(has(O,IE_PROTO))return O[IE_PROTO];if(typeof O.constructor=="function"&&O instanceof O.constructor){return O.constructor.prototype}return O instanceof Object?ObjectProto:null}},function(module,exports,__webpack_require__){__webpack_require__(55);var global=__webpack_require__(20),hide=__webpack_require__(28),Iterators=__webpack_require__(46),TO_STRING_TAG=__webpack_require__(52)("toStringTag");for(var collections=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],i=0;i<5;i++){var NAME=collections[i],Collection=global[NAME],proto=Collection&&Collection.prototype;if(proto&&!proto[TO_STRING_TAG])hide(proto,TO_STRING_TAG,NAME);Iterators[NAME]=Iterators.Array}},function(module,exports,__webpack_require__){"use strict";var addToUnscopables=__webpack_require__(56),step=__webpack_require__(57),Iterators=__webpack_require__(46),toIObject=__webpack_require__(11);module.exports=__webpack_require__(43)(Array,"Array",function(iterated,kind){this._t=toIObject(iterated);this._i=0;this._k=kind},function(){var O=this._t,kind=this._k,index=this._i++;if(!O||index>=O.length){this._t=undefined;return step(1)}if(kind=="keys")return step(0,index);if(kind=="values")return step(0,O[index]);return step(0,[index,O[index]])},"values");Iterators.Arguments=Iterators.Array;addToUnscopables("keys");addToUnscopables("values");addToUnscopables("entries")},function(module,exports){module.exports=function(){}},function(module,exports){module.exports=function(done,value){return{value:value,done:!!done}}},function(module,exports,__webpack_require__){"use strict";var LIBRARY=__webpack_require__(44),global=__webpack_require__(20),ctx=__webpack_require__(26),classof=__webpack_require__(59),$export=__webpack_require__(24),isObject=__webpack_require__(31),aFunction=__webpack_require__(27),anInstance=__webpack_require__(60),forOf=__webpack_require__(61),speciesConstructor=__webpack_require__(65),task=__webpack_require__(66).set,microtask=__webpack_require__(68)(),PROMISE="Promise",TypeError=global.TypeError,process=global.process,$Promise=global[PROMISE],process=global.process,isNode=classof(process)=="process",empty=function(){},Internal,GenericPromiseCapability,Wrapper;var USE_NATIVE=!!function(){try{var promise=$Promise.resolve(1),FakePromise=(promise.constructor={})[__webpack_require__(52)("species")]=function(exec){exec(empty,empty)};return(isNode||typeof PromiseRejectionEvent=="function")&&promise.then(empty)instanceof FakePromise}catch(e){}}();var sameConstructor=function(a,b){return a===b||a===$Promise&&b===Wrapper};var isThenable=function(it){var then;return isObject(it)&&typeof(then=it.then)=="function"?then:false};var newPromiseCapability=function(C){return sameConstructor($Promise,C)?new PromiseCapability(C):new GenericPromiseCapability(C)};var PromiseCapability=GenericPromiseCapability=function(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(resolve!==undefined||reject!==undefined)throw TypeError("Bad Promise constructor");resolve=$$resolve;reject=$$reject});this.resolve=aFunction(resolve);this.reject=aFunction(reject)};var perform=function(exec){try{exec()}catch(e){return{error:e}}};var notify=function(promise,isReject){if(promise._n)return;promise._n=true;var chain=promise._c;microtask(function(){var value=promise._v,ok=promise._s==1,i=0;var run=function(reaction){var handler=ok?reaction.ok:reaction.fail,resolve=reaction.resolve,reject=reaction.reject,domain=reaction.domain,result,then;try{if(handler){if(!ok){if(promise._h==2)onHandleUnhandled(promise);promise._h=1}if(handler===true)result=value;else{if(domain)domain.enter();result=handler(value);if(domain)domain.exit()}if(result===reaction.promise){reject(TypeError("Promise-chain cycle"))}else if(then=isThenable(result)){then.call(result,resolve,reject)}else resolve(result)}else reject(value)}catch(e){reject(e)}};while(chain.length>i)run(chain[i++]);promise._c=[];promise._n=false;if(isReject&&!promise._h)onUnhandled(promise)})};var onUnhandled=function(promise){task.call(global,function(){var value=promise._v,abrupt,handler,console;if(isUnhandled(promise)){abrupt=perform(function(){if(isNode){process.emit("unhandledRejection",value,promise)}else if(handler=global.onunhandledrejection){handler({promise:promise,reason:value})}else if((console=global.console)&&console.error){console.error("Unhandled promise rejection",value)}});promise._h=isNode||isUnhandled(promise)?2:1}promise._a=undefined;if(abrupt)throw abrupt.error})};var isUnhandled=function(promise){if(promise._h==1)return false;var chain=promise._a||promise._c,i=0,reaction;while(chain.length>i){reaction=chain[i++];if(reaction.fail||!isUnhandled(reaction.promise))return false}return true};var onHandleUnhandled=function(promise){task.call(global,function(){var handler;if(isNode){process.emit("rejectionHandled",promise)}else if(handler=global.onrejectionhandled){handler({promise:promise,reason:promise._v})}})};var $reject=function(value){var promise=this;if(promise._d)return;promise._d=true;promise=promise._w||promise;promise._v=value;promise._s=2;if(!promise._a)promise._a=promise._c.slice();notify(promise,true)};var $resolve=function(value){var promise=this,then;if(promise._d)return;promise._d=true;promise=promise._w||promise;try{if(promise===value)throw TypeError("Promise can't be resolved itself");if(then=isThenable(value)){microtask(function(){var wrapper={_w:promise,_d:false};try{then.call(value,ctx($resolve,wrapper,1),ctx($reject,wrapper,1))}catch(e){$reject.call(wrapper,e)}})}else{promise._v=value;promise._s=1;notify(promise,false)}}catch(e){$reject.call({_w:promise,_d:false},e)}};if(!USE_NATIVE){$Promise=function Promise(executor){anInstance(this,$Promise,PROMISE,"_h");aFunction(executor);Internal.call(this);try{executor(ctx($resolve,this,1),ctx($reject,this,1))}catch(err){$reject.call(this,err)}};Internal=function Promise(executor){this._c=[];this._a=undefined;this._s=0;this._d=false;this._v=undefined;this._h=0;this._n=false};Internal.prototype=__webpack_require__(69)($Promise.prototype,{then:function then(onFulfilled,onRejected){var reaction=newPromiseCapability(speciesConstructor(this,$Promise));reaction.ok=typeof onFulfilled=="function"?onFulfilled:true;reaction.fail=typeof onRejected=="function"&&onRejected;reaction.domain=isNode?process.domain:undefined;this._c.push(reaction);if(this._a)this._a.push(reaction);if(this._s)notify(this,false);return reaction.promise},"catch":function(onRejected){return this.then(undefined,onRejected)}});PromiseCapability=function(){var promise=new Internal;this.promise=promise;this.resolve=ctx($resolve,promise,1);this.reject=ctx($reject,promise,1)}}$export($export.G+$export.W+$export.F*!USE_NATIVE,{Promise:$Promise});__webpack_require__(51)($Promise,PROMISE);__webpack_require__(70)(PROMISE);Wrapper=__webpack_require__(25)[PROMISE];$export($export.S+$export.F*!USE_NATIVE,PROMISE,{reject:function reject(r){var capability=newPromiseCapability(this),$$reject=capability.reject;$$reject(r);return capability.promise}});$export($export.S+$export.F*(LIBRARY||!USE_NATIVE),PROMISE,{resolve:function resolve(x){if(x instanceof $Promise&&sameConstructor(x.constructor,this))return x;var capability=newPromiseCapability(this),$$resolve=capability.resolve;$$resolve(x);return capability.promise}});$export($export.S+$export.F*!(USE_NATIVE&&__webpack_require__(71)(function(iter){$Promise.all(iter)["catch"](empty)})),PROMISE,{all:function all(iterable){var C=this,capability=newPromiseCapability(C),resolve=capability.resolve,reject=capability.reject;var abrupt=perform(function(){var values=[],index=0,remaining=1;forOf(iterable,false,function(promise){var $index=index++,alreadyCalled=false;values.push(undefined);remaining++;C.resolve(promise).then(function(value){if(alreadyCalled)return;alreadyCalled=true;values[$index]=value;--remaining||resolve(values)},reject)});--remaining||resolve(values)});if(abrupt)reject(abrupt.error);return capability.promise},race:function race(iterable){var C=this,capability=newPromiseCapability(C),reject=capability.reject;var abrupt=perform(function(){forOf(iterable,false,function(promise){C.resolve(promise).then(capability.resolve,reject)})});if(abrupt)reject(abrupt.error);return capability.promise}})},function(module,exports,__webpack_require__){var cof=__webpack_require__(13),TAG=__webpack_require__(52)("toStringTag"),ARG=cof(function(){return arguments}())=="Arguments";var tryGet=function(it,key){try{return it[key]}catch(e){}};module.exports=function(it){var O,T,B;return it===undefined?"Undefined":it===null?"Null":typeof(T=tryGet(O=Object(it),TAG))=="string"?T:ARG?cof(O):(B=cof(O))=="Object"&&typeof O.callee=="function"?"Arguments":B}},function(module,exports){module.exports=function(it,Constructor,name,forbiddenField){if(!(it instanceof Constructor)||forbiddenField!==undefined&&forbiddenField in it){throw TypeError(name+": incorrect invocation!")}return it}},function(module,exports,__webpack_require__){var ctx=__webpack_require__(26),call=__webpack_require__(62),isArrayIter=__webpack_require__(63),anObject=__webpack_require__(30),toLength=__webpack_require__(15),getIterFn=__webpack_require__(64),BREAK={},RETURN={};var exports=module.exports=function(iterable,entries,fn,that,ITERATOR){var iterFn=ITERATOR?function(){return iterable}:getIterFn(iterable),f=ctx(fn,that,entries?2:1),index=0,length,step,iterator,result;if(typeof iterFn!="function")throw TypeError(iterable+" is not iterable!");if(isArrayIter(iterFn))for(length=toLength(iterable.length);length>index;index++){result=entries?f(anObject(step=iterable[index])[0],step[1]):f(iterable[index]);if(result===BREAK||result===RETURN)return result}else for(iterator=iterFn.call(iterable);!(step=iterator.next()).done;){result=call(iterator,f,step.value,entries);if(result===BREAK||result===RETURN)return result}};exports.BREAK=BREAK;exports.RETURN=RETURN},function(module,exports,__webpack_require__){var anObject=__webpack_require__(30);module.exports=function(iterator,fn,value,entries){try{return entries?fn(anObject(value)[0],value[1]):fn(value)}catch(e){var ret=iterator["return"];if(ret!==undefined)anObject(ret.call(iterator));throw e}}},function(module,exports,__webpack_require__){var Iterators=__webpack_require__(46),ITERATOR=__webpack_require__(52)("iterator"),ArrayProto=Array.prototype;module.exports=function(it){return it!==undefined&&(Iterators.Array===it||ArrayProto[ITERATOR]===it)}},function(module,exports,__webpack_require__){var classof=__webpack_require__(59),ITERATOR=__webpack_require__(52)("iterator"),Iterators=__webpack_require__(46);module.exports=__webpack_require__(25).getIteratorMethod=function(it){if(it!=undefined)return it[ITERATOR]||it["@@iterator"]||Iterators[classof(it)]}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(30),aFunction=__webpack_require__(27),SPECIES=__webpack_require__(52)("species");module.exports=function(O,D){var C=anObject(O).constructor,S;return C===undefined||(S=anObject(C)[SPECIES])==undefined?D:aFunction(S)}},function(module,exports,__webpack_require__){var ctx=__webpack_require__(26),invoke=__webpack_require__(67),html=__webpack_require__(50),cel=__webpack_require__(35),global=__webpack_require__(20),process=global.process,setTask=global.setImmediate,clearTask=global.clearImmediate,MessageChannel=global.MessageChannel,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",defer,channel,port;var run=function(){var id=+this;if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id];fn()}};var listener=function(event){run.call(event.data)};if(!setTask||!clearTask){setTask=function setImmediate(fn){var args=[],i=1;while(arguments.length>i)args.push(arguments[i++]);queue[++counter]=function(){invoke(typeof fn=="function"?fn:Function(fn),args)};defer(counter);return counter};clearTask=function clearImmediate(id){delete queue[id]};if(__webpack_require__(13)(process)=="process"){defer=function(id){process.nextTick(ctx(run,id,1))}}else if(MessageChannel){channel=new MessageChannel;port=channel.port2;channel.port1.onmessage=listener;defer=ctx(port.postMessage,port,1)}else if(global.addEventListener&&typeof postMessage=="function"&&!global.importScripts){defer=function(id){global.postMessage(id+"","*")};global.addEventListener("message",listener,false)}else if(ONREADYSTATECHANGE in cel("script")){defer=function(id){html.appendChild(cel("script"))[ONREADYSTATECHANGE]=function(){html.removeChild(this);run.call(id); 8 | }}}else{defer=function(id){setTimeout(ctx(run,id,1),0)}}}module.exports={set:setTask,clear:clearTask}},function(module,exports){module.exports=function(fn,args,that){var un=that===undefined;switch(args.length){case 0:return un?fn():fn.call(that);case 1:return un?fn(args[0]):fn.call(that,args[0]);case 2:return un?fn(args[0],args[1]):fn.call(that,args[0],args[1]);case 3:return un?fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);case 4:return un?fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3])}return fn.apply(that,args)}},function(module,exports,__webpack_require__){var global=__webpack_require__(20),macrotask=__webpack_require__(66).set,Observer=global.MutationObserver||global.WebKitMutationObserver,process=global.process,Promise=global.Promise,isNode=__webpack_require__(13)(process)=="process";module.exports=function(){var head,last,notify;var flush=function(){var parent,fn;if(isNode&&(parent=process.domain))parent.exit();while(head){fn=head.fn;head=head.next;try{fn()}catch(e){if(head)notify();else last=undefined;throw e}}last=undefined;if(parent)parent.enter()};if(isNode){notify=function(){process.nextTick(flush)}}else if(Observer){var toggle=true,node=document.createTextNode("");new Observer(flush).observe(node,{characterData:true});notify=function(){node.data=toggle=!toggle}}else if(Promise&&Promise.resolve){var promise=Promise.resolve();notify=function(){promise.then(flush)}}else{notify=function(){macrotask.call(global,flush)}}return function(fn){var task={fn:fn,next:undefined};if(last)last.next=task;if(!head){head=task;notify()}last=task}}},function(module,exports,__webpack_require__){var hide=__webpack_require__(28);module.exports=function(target,src,safe){for(var key in src){if(safe&&target[key])target[key]=src[key];else hide(target,key,src[key])}return target}},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(20),core=__webpack_require__(25),dP=__webpack_require__(29),DESCRIPTORS=__webpack_require__(33),SPECIES=__webpack_require__(52)("species");module.exports=function(KEY){var C=typeof core[KEY]=="function"?core[KEY]:global[KEY];if(DESCRIPTORS&&C&&!C[SPECIES])dP.f(C,SPECIES,{configurable:true,get:function(){return this}})}},function(module,exports,__webpack_require__){var ITERATOR=__webpack_require__(52)("iterator"),SAFE_CLOSING=false;try{var riter=[7][ITERATOR]();riter["return"]=function(){SAFE_CLOSING=true};Array.from(riter,function(){throw 2})}catch(e){}module.exports=function(exec,skipClosing){if(!skipClosing&&!SAFE_CLOSING)return false;var safe=false;try{var arr=[7],iter=arr[ITERATOR]();iter.next=function(){return{done:safe=true}};arr[ITERATOR]=function(){return iter};exec(arr)}catch(e){}return safe}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _keys=__webpack_require__(3);var _keys2=_interopRequireDefault(_keys);var _promise=__webpack_require__(38);var _promise2=_interopRequireDefault(_promise);var _typeof2=__webpack_require__(73);var _typeof3=_interopRequireDefault(_typeof2);var _util=__webpack_require__(92);var _util2=_interopRequireDefault(_util);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}exports.default={render:function render(h){if(!this.display)return;return h(this.type,{props:{form:this.form,field:this.field,model:this.model,to:this.templateOptions}})},props:["form","model","field","to"],computed:{templateOptions:function templateOptions(){return this.field.templateOptions||{}},type:function type(){return"formly_"+this.field.type},display:function display(){var displayType=(0,_typeof3.default)(this.field.display);if(displayType!=="function"&&displayType!=="string")return true;if(displayType==="function"){return this.field.display(this.field,this.model)}else{var result=new Function("field","model","return "+this.field.display+";");return result.call({},this.field,this.model)}}},methods:{validate:function validate(){var _this=this;return new _promise2.default(function(resolve,reject){if(!_this.form.$errors[_this.field.key])_this.$set(_this.form.$errors,_this.field.key,{});if(!_this.field.templateOptions)_this.$set(_this.field,"templateOptions",{});var label="templateOptions"in _this.field&&"label"in _this.field.templateOptions?_this.field.templateOptions.label:"";if(!_this.display){_this.$set(_this.form.$errors,_this.field.key,{});return resolve()}if(_this.field.required){if(!_this.form.$errors[_this.field.key].required)_this.$set(_this.form.$errors[_this.field.key],"required",true);var requiredError=(0,_util.parseValidationString)("required",false,label,_this.model[_this.field.key]);var requiredType=typeof _this.model[_this.field.key]==="string"?!_this.model[_this.field.key]:_this.model[_this.field.key]===null||_this.model[_this.field.key]===undefined||_this.model[_this.field.key].length===0;var required=_this.display?requiredType:false;(0,_util.setError)(_this.form,_this.field.key,"required",required,requiredError)}if(!_this.field.validators)return resolve();var model=_this.model;var field=_this.field;(0,_keys2.default)(_this.field.validators).forEach(function(validKey){if(!_this.form.$errors[_this.field.key][validKey])_this.$set(_this.form.$errors[_this.field.key],validKey,false);if(_this.field.required===false&&!_this.model[_this.field.key]){(0,_util.setError)(_this.form,_this.field.key,validKey,false);return resolve()}var validator=_this.field.validators[validKey];var validatorMessage=false;if((typeof validator==="undefined"?"undefined":(0,_typeof3.default)(validator))==="object"){if(!("message"in validator)){console.error("Looks like you've set a validator object without setting a message. If you don't need to explicity set the message just define the validator as either an expression or a function. Refer to the docs for more info")}else{validatorMessage=validator.message;validator=validator.expression}}validatorMessage=(0,_util.parseValidationString)(validKey,validatorMessage,label,model[_this.field.key]);var valid=false;if(typeof validator==="function"){var asyncKey="$async_"+validKey;_this.$set(_this.form.$errors[_this.field.key],asyncKey,true);validator(field,model,function(){var asyncValid=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var asyncValidatorMessage=arguments.length>1&&arguments[1]!==undefined?arguments[1]:validatorMessage;(0,_util.setError)(_this.form,_this.field.key,validKey,!asyncValid,asyncValidatorMessage);_this.$set(_this.form.$errors[_this.field.key],asyncKey,false);resolve()})}else{var res=new Function("model","field","return "+validator+";");valid=!res.call({},model,field);(0,_util.setError)(_this.form,_this.field.key,validKey,valid,validatorMessage);resolve()}})})}},components:(0,_util.getTypes)(),created:function created(){var _this2=this;this.validate();this.$watch("model",function(val){var valid=_this2.validate()},{deep:true})},mounted:function mounted(){if(!this.field.wrapper)return;var wrapper=document.createElement("DIV");wrapper.innerHTML=this.field.wrapper;var parent=this.$el.parentNode;parent.insertBefore(wrapper,this.$el);wrapper.firstChild.appendChild(this.$el);parent.insertBefore(wrapper.firstChild,wrapper);parent.removeChild(wrapper)}}},function(module,exports,__webpack_require__){"use strict";exports.__esModule=true;var _iterator=__webpack_require__(74);var _iterator2=_interopRequireDefault(_iterator);var _symbol=__webpack_require__(77);var _symbol2=_interopRequireDefault(_symbol);var _typeof=typeof _symbol2.default==="function"&&typeof _iterator2.default==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof _symbol2.default==="function"&&obj.constructor===_symbol2.default&&obj!==_symbol2.default.prototype?"symbol":typeof obj};function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}exports.default=typeof _symbol2.default==="function"&&_typeof(_iterator2.default)==="symbol"?function(obj){return typeof obj==="undefined"?"undefined":_typeof(obj)}:function(obj){return obj&&typeof _symbol2.default==="function"&&obj.constructor===_symbol2.default&&obj!==_symbol2.default.prototype?"symbol":typeof obj==="undefined"?"undefined":_typeof(obj)}},function(module,exports,__webpack_require__){module.exports={"default":__webpack_require__(75),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(41);__webpack_require__(54);module.exports=__webpack_require__(76).f("iterator")},function(module,exports,__webpack_require__){exports.f=__webpack_require__(52)},function(module,exports,__webpack_require__){module.exports={"default":__webpack_require__(78),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(79);__webpack_require__(40);__webpack_require__(90);__webpack_require__(91);module.exports=__webpack_require__(25).Symbol},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(20),has=__webpack_require__(10),DESCRIPTORS=__webpack_require__(33),$export=__webpack_require__(24),redefine=__webpack_require__(45),META=__webpack_require__(80).KEY,$fails=__webpack_require__(34),shared=__webpack_require__(19),setToStringTag=__webpack_require__(51),uid=__webpack_require__(21),wks=__webpack_require__(52),wksExt=__webpack_require__(76),wksDefine=__webpack_require__(81),keyOf=__webpack_require__(82),enumKeys=__webpack_require__(83),isArray=__webpack_require__(86),anObject=__webpack_require__(30),toIObject=__webpack_require__(11),toPrimitive=__webpack_require__(36),createDesc=__webpack_require__(37),_create=__webpack_require__(48),gOPNExt=__webpack_require__(87),$GOPD=__webpack_require__(89),$DP=__webpack_require__(29),$keys=__webpack_require__(8),gOPD=$GOPD.f,dP=$DP.f,gOPN=gOPNExt.f,$Symbol=global.Symbol,$JSON=global.JSON,_stringify=$JSON&&$JSON.stringify,PROTOTYPE="prototype",HIDDEN=wks("_hidden"),TO_PRIMITIVE=wks("toPrimitive"),isEnum={}.propertyIsEnumerable,SymbolRegistry=shared("symbol-registry"),AllSymbols=shared("symbols"),OPSymbols=shared("op-symbols"),ObjectProto=Object[PROTOTYPE],USE_NATIVE=typeof $Symbol=="function",QObject=global.QObject;var setter=!QObject||!QObject[PROTOTYPE]||!QObject[PROTOTYPE].findChild;var setSymbolDesc=DESCRIPTORS&&$fails(function(){return _create(dP({},"a",{get:function(){return dP(this,"a",{value:7}).a}})).a!=7})?function(it,key,D){var protoDesc=gOPD(ObjectProto,key);if(protoDesc)delete ObjectProto[key];dP(it,key,D);if(protoDesc&&it!==ObjectProto)dP(ObjectProto,key,protoDesc)}:dP;var wrap=function(tag){var sym=AllSymbols[tag]=_create($Symbol[PROTOTYPE]);sym._k=tag;return sym};var isSymbol=USE_NATIVE&&typeof $Symbol.iterator=="symbol"?function(it){return typeof it=="symbol"}:function(it){return it instanceof $Symbol};var $defineProperty=function defineProperty(it,key,D){if(it===ObjectProto)$defineProperty(OPSymbols,key,D);anObject(it);key=toPrimitive(key,true);anObject(D);if(has(AllSymbols,key)){if(!D.enumerable){if(!has(it,HIDDEN))dP(it,HIDDEN,createDesc(1,{}));it[HIDDEN][key]=true}else{if(has(it,HIDDEN)&&it[HIDDEN][key])it[HIDDEN][key]=false;D=_create(D,{enumerable:createDesc(0,false)})}return setSymbolDesc(it,key,D)}return dP(it,key,D)};var $defineProperties=function defineProperties(it,P){anObject(it);var keys=enumKeys(P=toIObject(P)),i=0,l=keys.length,key;while(l>i)$defineProperty(it,key=keys[i++],P[key]);return it};var $create=function create(it,P){return P===undefined?_create(it):$defineProperties(_create(it),P)};var $propertyIsEnumerable=function propertyIsEnumerable(key){var E=isEnum.call(this,key=toPrimitive(key,true));if(this===ObjectProto&&has(AllSymbols,key)&&!has(OPSymbols,key))return false;return E||!has(this,key)||!has(AllSymbols,key)||has(this,HIDDEN)&&this[HIDDEN][key]?E:true};var $getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){it=toIObject(it);key=toPrimitive(key,true);if(it===ObjectProto&&has(AllSymbols,key)&&!has(OPSymbols,key))return;var D=gOPD(it,key);if(D&&has(AllSymbols,key)&&!(has(it,HIDDEN)&&it[HIDDEN][key]))D.enumerable=true;return D};var $getOwnPropertyNames=function getOwnPropertyNames(it){var names=gOPN(toIObject(it)),result=[],i=0,key;while(names.length>i){if(!has(AllSymbols,key=names[i++])&&key!=HIDDEN&&key!=META)result.push(key)}return result};var $getOwnPropertySymbols=function getOwnPropertySymbols(it){var IS_OP=it===ObjectProto,names=gOPN(IS_OP?OPSymbols:toIObject(it)),result=[],i=0,key;while(names.length>i){if(has(AllSymbols,key=names[i++])&&(IS_OP?has(ObjectProto,key):true))result.push(AllSymbols[key])}return result};if(!USE_NATIVE){$Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor!");var tag=uid(arguments.length>0?arguments[0]:undefined);var $set=function(value){if(this===ObjectProto)$set.call(OPSymbols,value);if(has(this,HIDDEN)&&has(this[HIDDEN],tag))this[HIDDEN][tag]=false;setSymbolDesc(this,tag,createDesc(1,value))};if(DESCRIPTORS&&setter)setSymbolDesc(ObjectProto,tag,{configurable:true,set:$set});return wrap(tag)};redefine($Symbol[PROTOTYPE],"toString",function toString(){return this._k});$GOPD.f=$getOwnPropertyDescriptor;$DP.f=$defineProperty;__webpack_require__(88).f=gOPNExt.f=$getOwnPropertyNames;__webpack_require__(85).f=$propertyIsEnumerable;__webpack_require__(84).f=$getOwnPropertySymbols;if(DESCRIPTORS&&!__webpack_require__(44)){redefine(ObjectProto,"propertyIsEnumerable",$propertyIsEnumerable,true)}wksExt.f=function(name){return wrap(wks(name))}}$export($export.G+$export.W+$export.F*!USE_NATIVE,{Symbol:$Symbol});for(var symbols="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),i=0;symbols.length>i;)wks(symbols[i++]);for(var symbols=$keys(wks.store),i=0;symbols.length>i;)wksDefine(symbols[i++]);$export($export.S+$export.F*!USE_NATIVE,"Symbol",{"for":function(key){return has(SymbolRegistry,key+="")?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key)},keyFor:function keyFor(key){if(isSymbol(key))return keyOf(SymbolRegistry,key);throw TypeError(key+" is not a symbol!")},useSetter:function(){setter=true},useSimple:function(){setter=false}});$export($export.S+$export.F*!USE_NATIVE,"Object",{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor,getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols});$JSON&&$export($export.S+$export.F*(!USE_NATIVE||$fails(function(){var S=$Symbol();return _stringify([S])!="[null]"||_stringify({a:S})!="{}"||_stringify(Object(S))!="{}"})),"JSON",{stringify:function stringify(it){if(it===undefined||isSymbol(it))return;var args=[it],i=1,replacer,$replacer;while(arguments.length>i)args.push(arguments[i++]);replacer=args[1];if(typeof replacer=="function")$replacer=replacer;if($replacer||!isArray(replacer))replacer=function(key,value){if($replacer)value=$replacer.call(this,key,value);if(!isSymbol(value))return value};args[1]=replacer;return _stringify.apply($JSON,args)}});$Symbol[PROTOTYPE][TO_PRIMITIVE]||__webpack_require__(28)($Symbol[PROTOTYPE],TO_PRIMITIVE,$Symbol[PROTOTYPE].valueOf);setToStringTag($Symbol,"Symbol");setToStringTag(Math,"Math",true);setToStringTag(global.JSON,"JSON",true)},function(module,exports,__webpack_require__){var META=__webpack_require__(21)("meta"),isObject=__webpack_require__(31),has=__webpack_require__(10),setDesc=__webpack_require__(29).f,id=0;var isExtensible=Object.isExtensible||function(){return true};var FREEZE=!__webpack_require__(34)(function(){return isExtensible(Object.preventExtensions({}))});var setMeta=function(it){setDesc(it,META,{value:{i:"O"+ ++id,w:{}}})};var fastKey=function(it,create){if(!isObject(it))return typeof it=="symbol"?it:(typeof it=="string"?"S":"P")+it;if(!has(it,META)){if(!isExtensible(it))return"F";if(!create)return"E";setMeta(it)}return it[META].i};var getWeak=function(it,create){if(!has(it,META)){if(!isExtensible(it))return true;if(!create)return false;setMeta(it)}return it[META].w};var onFreeze=function(it){if(FREEZE&&meta.NEED&&isExtensible(it)&&!has(it,META))setMeta(it);return it};var meta=module.exports={KEY:META,NEED:false,fastKey:fastKey,getWeak:getWeak,onFreeze:onFreeze}},function(module,exports,__webpack_require__){var global=__webpack_require__(20),core=__webpack_require__(25),LIBRARY=__webpack_require__(44),wksExt=__webpack_require__(76),defineProperty=__webpack_require__(29).f;module.exports=function(name){var $Symbol=core.Symbol||(core.Symbol=LIBRARY?{}:global.Symbol||{});if(name.charAt(0)!="_"&&!(name in $Symbol))defineProperty($Symbol,name,{value:wksExt.f(name)})}},function(module,exports,__webpack_require__){var getKeys=__webpack_require__(8),toIObject=__webpack_require__(11);module.exports=function(object,el){var O=toIObject(object),keys=getKeys(O),length=keys.length,index=0,key;while(length>index)if(O[key=keys[index++]]===el)return key}},function(module,exports,__webpack_require__){var getKeys=__webpack_require__(8),gOPS=__webpack_require__(84),pIE=__webpack_require__(85);module.exports=function(it){var result=getKeys(it),getSymbols=gOPS.f;if(getSymbols){var symbols=getSymbols(it),isEnum=pIE.f,i=0,key;while(symbols.length>i)if(isEnum.call(it,key=symbols[i++]))result.push(key)}return result}},function(module,exports){exports.f=Object.getOwnPropertySymbols},function(module,exports){exports.f={}.propertyIsEnumerable},function(module,exports,__webpack_require__){var cof=__webpack_require__(13);module.exports=Array.isArray||function isArray(arg){return cof(arg)=="Array"}},function(module,exports,__webpack_require__){var toIObject=__webpack_require__(11),gOPN=__webpack_require__(88).f,toString={}.toString;var windowNames=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];var getWindowNames=function(it){try{return gOPN(it)}catch(e){return windowNames.slice()}};module.exports.f=function getOwnPropertyNames(it){return windowNames&&toString.call(it)=="[object Window]"?getWindowNames(it):gOPN(toIObject(it))}},function(module,exports,__webpack_require__){var $keys=__webpack_require__(9),hiddenKeys=__webpack_require__(22).concat("length","prototype");exports.f=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return $keys(O,hiddenKeys)}},function(module,exports,__webpack_require__){var pIE=__webpack_require__(85),createDesc=__webpack_require__(37),toIObject=__webpack_require__(11),toPrimitive=__webpack_require__(36),has=__webpack_require__(10),IE8_DOM_DEFINE=__webpack_require__(32),gOPD=Object.getOwnPropertyDescriptor;exports.f=__webpack_require__(33)?gOPD:function getOwnPropertyDescriptor(O,P){O=toIObject(O);P=toPrimitive(P,true);if(IE8_DOM_DEFINE)try{return gOPD(O,P)}catch(e){}if(has(O,P))return createDesc(!pIE.f.call(O,P),O[P])}},function(module,exports,__webpack_require__){__webpack_require__(81)("asyncIterator")},function(module,exports,__webpack_require__){__webpack_require__(81)("observable")},function(module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.addType=addType;exports.getTypes=getTypes;exports.set=set;exports.get=get;exports.setError=setError;exports.addValidationMessage=addValidationMessage;exports.parseValidationString=parseValidationString;var _exports={formlyFields:{},validationMessages:{}};exports.default=_exports;function addType(id,options){_exports.formlyFields["formly_"+id]=options}function getTypes(){return _exports.formlyFields}function set(target,key,val){if(hasNestedProperty(target,key)){var parts=key.split(".");var finalKey=parts.pop();var newTarget=parts.reduce(function(acc,cur){return acc[cur]},target);this.$set(newTarget,finalKey,val)}else{this.$set(target,key,val)}}function get(target,key){var hasNested=hasNestedProperty(target,key,true);return hasNested===null?target[key]:hasNested}function hasNestedProperty(obj,propertyPath){var returnVal=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(!propertyPath)return false;propertyPath=propertyPath.replace(/^\./,"");var properties=propertyPath.split(".");for(var i=0;i4&&arguments[4]!==undefined?arguments[4]:false;if(!form.$errors[key])form.$errors[key]={};form.$errors[key][err]=isError?message||isError:false}function addValidationMessage(key,message){_exports.validationMessages[key]=message}function parseValidationString(key,message,label,value){if(key&&!(key in _exports.validationMessages)&&!message)return false;if(key in _exports.validationMessages){message=_exports.validationMessages[key]}var output=message.replace(/\%l/g,label).replace(/\%v/g,value);return output}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _keys=__webpack_require__(3);var _keys2=_interopRequireDefault(_keys);exports.default=function(Vue){Vue.filter("formlyFields",function(fields){var re=/^\$/;var valid=(0,_keys2.default)(fields).filter(function(key){return!re.test(key)});return valid})};function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _keys=__webpack_require__(3);var _keys2=_interopRequireDefault(_keys);exports.default=function(Vue){Vue.directive("formly-atts",{bind:function bind(el,binding){if(!binding.value)return;(0,_keys2.default)(binding.value).forEach(function(key){el.setAttribute(key,binding.value[key])})}});Vue.directive("formly-input-type",{bind:function bind(el,binding){if(!binding.value)return;el.setAttribute("type",binding.value)}})};function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}}])}); --------------------------------------------------------------------------------