diff --git a/.eslintrc.js b/.eslintrc.js index d6695b81..e7542945 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,7 +4,8 @@ module.exports = { "browser": true, "commonjs": true, "es6": true, - "jquery": true + "jquery": true, + mocha: true }, "extends": "eslint:recommended", "parserOptions": { diff --git a/dev/data.js b/dev/data.js index 4d58b877..0e64aab0 100644 --- a/dev/data.js +++ b/dev/data.js @@ -1,6 +1,8 @@ -import faker from 'faker'; +import Fakerator from 'fakerator'; import moment from 'moment'; +let fakerator = new Fakerator(); + let roles = [ { id: "admin", name: "Administrator"}, { id: "moderator", name: "Moderator"}, @@ -17,63 +19,33 @@ module.exports = { users: (function() { let res = []; for (let i = 0; i < 5; i++) { - let lang = faker.helpers.randomize(['en-US', 'en-GB', 'de', 'fr', 'it']); - //faker.locale = lang; - let user = faker.helpers.createCard(); + let lang = fakerator.random.arrayElement(['en-US', 'en-GB', 'de', 'fr', 'it']); + let user = fakerator.entity.user(); user.id = i + 1; - user.type = faker.helpers.randomize(["personal", "business"]); - user.password = faker.internet.password(10); - user.bio = faker.lorem.paragraph(); - let dob = faker.date.past(40, "1998-01-01"); + user.type = fakerator.random.arrayElement(["personal", "business"]); + user.bio = fakerator.lorem.paragraph(); + let dob = fakerator.date.past(40, "1998-01-01"); user.dob = dob.valueOf(); user.time = moment().format("hh:mm:ss"); user.age = moment().year() - moment(dob).year(); - user.rank = faker.random.number({ - min: 1, - max: 10 - }); - user.role = faker.helpers.randomize(roles).id; - //user.mobile = faker.phone.phoneNumber(); - user.avatar = faker.internet.avatar(); + user.rank = fakerator.random.number(1, 10); + user.role = fakerator.random.arrayElement(roles).id; + //user.mobile = fakerator.phone.phoneNumber(); + user.avatar = fakerator.internet.avatar(); - user.skills = []; - user.skills.push(faker.helpers.randomize(skills)); - user.skills.push(faker.helpers.randomize(skills)); + user.skills = fakerator.utimes(fakerator.random.arrayElement, 2, skills); user.language = lang; - user.status = faker.helpers.randomize([true, false, true]); - user.created = faker.date.recent(30).valueOf(); - user.dt = faker.date.recent(30).valueOf(); - user.favoriteColor = faker.internet.color(); - - if (user.type == "business") { - user.company = { - "name": faker.company.companyName(), - "catchPhrase": faker.company.catchPhrase(), - "bs": faker.company.bs(), - "website": faker.internet.domainName(), - "phone": faker.phone.phoneNumber(), - "address": { - "street": faker.address.streetAddress(), - "city": faker.address.city(), - "country": faker.address.country(), - "zipcode": faker.address.zipCode(), - "geo": { - "lat": faker.address.latitude(), - "lng": faker.address.longitude() - } - } - - } - } else { - user.company = undefined; - } - - user.posts = undefined; - user.accountHistory = undefined; - + user.status = fakerator.random.boolean(75); + user.created = fakerator.date.recent(30).valueOf(); + user.dt = fakerator.date.recent(30).valueOf(); + user.favoriteColor = "#" + fakerator.internet.color(); + + if (user.type == "business") + user.company = fakerator.entity.company(); + res.push(user); - //console.log(user); + console.log(user); } //console.log(res); return res; diff --git a/dev/dataTable.vue b/dev/dataTable.vue index 119a1842..11e88364 100644 --- a/dev/dataTable.vue +++ b/dev/dataTable.vue @@ -14,7 +14,7 @@ td {{ row.id }} td img(:src="row.avatar") - | {{ row.name }} + | {{ row.firstName + " " + row.lastName }} ({{row.userName}}) .label.label-warning(v-if="!row.status") Inactive td {{ row.email }} td {{ row.address.country }} diff --git a/dev/schema.js b/dev/schema.js index 2d47d7f4..3c01b469 100644 --- a/dev/schema.js +++ b/dev/schema.js @@ -1,9 +1,11 @@ import moment from "moment"; -import faker from "faker"; +import Fakerator from "fakerator"; import {} from "lodash"; import { validators } from "../src"; +let fakerator = new Fakerator(); + module.exports = { fields: [ { @@ -28,11 +30,11 @@ module.exports = { }, { type: "text", - label: "Name", - model: "name", + label: "First name", + model: "firstName", featured: true, required: true, - placeholder: "User's full name", + placeholder: "User's first name", validator: validators.string, onChanged(model, newVal, oldVal, field) { @@ -44,6 +46,25 @@ module.exports = { // console.warn("Validation error in Name field! Errors:", errors); } }, + { + type: "text", + label: "Last name", + model: "lastName", + featured: true, + required: true, + placeholder: "User's last name", + validator: validators.string + }, + { + type: "text", + label: "Username", + model: "userName", + featured: true, + required: true, + min: 5, + placeholder: "User's last name", + validator: validators.string + }, { type: "password", label: "Password", @@ -253,7 +274,7 @@ module.exports = { model: "address.country", multi: true, required: true, - values: faker.definitions.address.country, + values: ["United Kingdom", "France", "Germany"], //default: "United Kingdom", multiSelect: false, selectOptions: { @@ -273,7 +294,7 @@ module.exports = { { type: "text", label: "Street", - model: "address.streetC" + model: "address.street" }, { type: "text", @@ -282,7 +303,7 @@ module.exports = { disabled: false, get(model) { if (model && model.address && model.address.geo) - return model.address.geo.lat + ", " + model.address.geo.lng; + return model.address.geo.latitude + ", " + model.address.geo.longitude; }, set(model, val) { let values = val.split(","); @@ -293,14 +314,14 @@ module.exports = { model.address.geo = {}; if (values.length > 0 && values[0].trim() != "") - model.address.geo.lat = parseFloat(values[0].trim()); + model.address.geo.latitude = parseFloat(values[0].trim()); else - model.address.geo.lat = 0 + model.address.geo.latitude = 0 if (values.length > 1 && values[1].trim() != "") - model.address.geo.lng = parseFloat(values[1].trim()); + model.address.geo.longitude = parseFloat(values[1].trim()); else - model.address.geo.lng = 0 + model.address.geo.longitude = 0 }, buttons: [ { @@ -315,8 +336,8 @@ module.exports = { if (!model.address.geo) model.address.geo = {}; - model.address.geo.lat = pos.coords.latitude.toFixed(5); - model.address.geo.lng = pos.coords.longitude.toFixed(5); + model.address.geo.latitude = pos.coords.latitude.toFixed(5); + model.address.geo.longitude = pos.coords.longitude.toFixed(5); }); } else { alert("Geolocation is not supported by this browser."); @@ -328,8 +349,8 @@ module.exports = { label: "Clear", onclick: function(model) { model.address.geo = { - lat: 0, - lng: 0 + latitude: 0, + longitude: 0 }; } } diff --git a/package.json b/package.json index 8070bcb5..29998e7e 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "prebuild": "npm run test", "build": "webpack --config webpack.build.config.js", "dev": "webpack-dev-server --config webpack.dev.config.js --inline --hot --content-base dev/", - "lint": "eslint --ext=.js,.vue src", + "lint": "eslint --ext=.js,.vue src test/unit/specs", "coverall": "cat ./test/unit/coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", "coverage": "npm run test && npm run coverall", "changelog": "conventional-changelog -i CHANGELOG.md -s", @@ -54,7 +54,7 @@ "eslint-loader": "1.3.0", "eslint-plugin-html": "1.4.0", "eslint-plugin-vue": "0.1.1", - "faker": "3.1.0", + "fakerator": "0.1.1", "git-commit-message-convention": "git://github.com/kazupon/git-commit-message-convention.git#065dfffbe2de5f6f16150aac9d4db7fdf5515e56", "gitbook-cli": "2.1.3", "inject-loader": "2.0.1", diff --git a/test/unit/specs/VueFormGenerator.spec.js b/test/unit/specs/VueFormGenerator.spec.js index 24db3072..ee860dab 100644 --- a/test/unit/specs/VueFormGenerator.spec.js +++ b/test/unit/specs/VueFormGenerator.spec.js @@ -29,7 +29,6 @@ describe("VueFormGenerator.vue", () => { describe("with empty schema", () => { let schema = {}; - let model = null; beforeEach( () => { createFormGenerator(schema); @@ -75,7 +74,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("featured")).to.be.true; done(); - }) + }); }); it("should be readonly class", (done) => { @@ -83,7 +82,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("readonly")).to.be.true; done(); - }) + }); }); it("should be disabled class", (done) => { @@ -91,7 +90,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("disabled")).to.be.true; done(); - }) + }); }); it("should be required class", (done) => { @@ -99,7 +98,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("required")).to.be.true; done(); - }) + }); }); it("should be error class", (done) => { @@ -107,7 +106,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("error")).to.be.true; done(); - }) + }); }); it("should be add a custom classes", (done) => { @@ -115,7 +114,7 @@ describe("VueFormGenerator.vue", () => { vm.$nextTick(() => { expect(tr.classList.contains("classA")).to.be.true; done(); - }) + }); }); it("should be add more custom classes", (done) => { @@ -124,13 +123,13 @@ describe("VueFormGenerator.vue", () => { expect(tr.classList.contains("classB")).to.be.true; expect(tr.classList.contains("classC")).to.be.true; done(); - }) + }); }); }); describe("check form row caption cell", () => { - let tr, tdCaption, tdField; + let tr, tdCaption; let schema = { fields: [ { @@ -146,7 +145,6 @@ describe("VueFormGenerator.vue", () => { createFormGenerator(schema); tr = el.getElementsByTagName("tr")[0]; tdCaption = tr.getElementsByTagName("td")[0]; - tdField = tr.getElementsByTagName("td")[1]; }); it("should be text of cell is the name of field", () => { @@ -163,7 +161,7 @@ describe("VueFormGenerator.vue", () => { expect(span.querySelector(".helpText")).to.be.exist; expect(span.querySelector(".helpText").textContent).to.be.equal("Sample help"); done(); - }) + }); }); }); @@ -246,10 +244,11 @@ describe("VueFormGenerator.vue", () => { } ] }; + let model = { name: "John Doe", status: true - } + }; before( () => { createFormGenerator(schema, model); @@ -319,10 +318,11 @@ describe("VueFormGenerator.vue", () => { } ] }; + let model = { name: "John Doe", status: true - } + }; before( () => { createFormGenerator(schema, model); diff --git a/test/unit/specs/fields/abstractField.spec.js b/test/unit/specs/fields/abstractField.spec.js index 80e466f9..0cf5548f 100644 --- a/test/unit/specs/fields/abstractField.spec.js +++ b/test/unit/specs/fields/abstractField.spec.js @@ -1,7 +1,7 @@ +/* global sinon */ import { expect } from "chai"; import Vue from "vue"; -import VueFormGenerator from "src/index"; import AbstractField from "src/fields/abstractField"; Vue.component("AbstractField", AbstractField); @@ -133,7 +133,7 @@ describe("abstractField.vue", () => { expect(schema.onChanged.calledOnce).to.be.true; expect(schema.onChanged.calledWith(model, "Jane Doe", "John Doe", schema)).to.be.true; done(); - }) + }); }); }); @@ -148,7 +148,7 @@ describe("abstractField.vue", () => { let model = { name: "John Doe" }; let options = { validateAfterChanged: false - } + }; beforeEach( () => { createField(schema, model, false, options); diff --git a/test/unit/specs/fields/fieldChecklist.spec.js b/test/unit/specs/fields/fieldChecklist.spec.js index cc2f3001..b20e2074 100644 --- a/test/unit/specs/fields/fieldChecklist.spec.js +++ b/test/unit/specs/fields/fieldChecklist.spec.js @@ -176,7 +176,7 @@ describe("fieldChecklist.vue", () => { { id: 5, name: "AngularJS" }, { id: 6, name: "ReactJS" }, { id: 7, name: "VueJS" } - ] + ]; } }; let model = { skills: [2, 7] }; diff --git a/test/unit/specs/fields/fieldImage.spec.js b/test/unit/specs/fields/fieldImage.spec.js index f4048de9..2a37c7f3 100644 --- a/test/unit/specs/fields/fieldImage.spec.js +++ b/test/unit/specs/fields/fieldImage.spec.js @@ -1,3 +1,5 @@ +/* global sinon */ + import { expect } from "chai"; import { createVueField, trigger } from "../util"; @@ -147,7 +149,7 @@ describe("fieldImage.vue", () => { // Stub the browser FileReader let FR = window.FileReader; window.FileReader = sinon.stub().returns({ - readAsDataURL(file) { + readAsDataURL() { this.onload({ target: { result: "base64 image data" @@ -167,7 +169,6 @@ describe("fieldImage.vue", () => { }); vm.$nextTick( () => { - let remove = el.querySelector(".remove"); expect(input.value).to.be.equal("base64 image data"); expect(model.avatar).to.be.equal("base64 image data"); diff --git a/test/unit/specs/fields/fieldLabel.spec.js b/test/unit/specs/fields/fieldLabel.spec.js index ff5a0d30..35fec471 100644 --- a/test/unit/specs/fields/fieldLabel.spec.js +++ b/test/unit/specs/fields/fieldLabel.spec.js @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { createVueField, trigger } from "../util"; +import { createVueField } from "../util"; import Vue from "vue"; import FieldLabel from "src/fields/fieldLabel.vue"; diff --git a/test/unit/specs/fields/fieldSelect.spec.js b/test/unit/specs/fields/fieldSelect.spec.js index 4de7357f..c8e3fcec 100644 --- a/test/unit/specs/fields/fieldSelect.spec.js +++ b/test/unit/specs/fields/fieldSelect.spec.js @@ -177,7 +177,7 @@ describe("fieldSelect.vue", () => { { id: 2, name: "Paris" }, { id: 3, name: "Rome" }, { id: 4, name: "Berlin" } - ] + ]; } }; let model = { city: 2 }; diff --git a/test/unit/specs/fields/fieldSelectEx.spec.js b/test/unit/specs/fields/fieldSelectEx.spec.js index c5307cb9..857c6521 100644 --- a/test/unit/specs/fields/fieldSelectEx.spec.js +++ b/test/unit/specs/fields/fieldSelectEx.spec.js @@ -189,7 +189,7 @@ describe("fieldSelectEx.vue", () => { { id: 2, name: "Paris" }, { id: 3, name: "Rome" }, { id: 4, name: "Berlin" } - ] + ]; } }; let model = { city: 2 }; diff --git a/test/unit/specs/fields/fieldSlider.spec.js b/test/unit/specs/fields/fieldSlider.spec.js index 9e5e4d50..077ea00c 100644 --- a/test/unit/specs/fields/fieldSlider.spec.js +++ b/test/unit/specs/fields/fieldSlider.spec.js @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { createVueField, trigger } from "../util"; +import { createVueField } from "../util"; import Vue from "vue"; import FieldSlider from "src/fields/fieldSlider.vue"; diff --git a/test/unit/specs/fields/fieldSpectrum.spec.js b/test/unit/specs/fields/fieldSpectrum.spec.js index 3005a544..99c96bf5 100644 --- a/test/unit/specs/fields/fieldSpectrum.spec.js +++ b/test/unit/specs/fields/fieldSpectrum.spec.js @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { createVueField, trigger } from "../util"; +import { createVueField } from "../util"; import Vue from "vue"; import FieldSpectrum from "src/fields/fieldSpectrum.vue"; diff --git a/test/unit/specs/fields/fieldStaticMap.spec.js b/test/unit/specs/fields/fieldStaticMap.spec.js index 7be8391f..607a4ce3 100644 --- a/test/unit/specs/fields/fieldStaticMap.spec.js +++ b/test/unit/specs/fields/fieldStaticMap.spec.js @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { createVueField, trigger } from "../util"; +import { createVueField } from "../util"; import Vue from "vue"; import FieldStaticMap from "src/fields/fieldStaticMap.vue"; diff --git a/test/unit/specs/index.spec.js b/test/unit/specs/index.spec.js index a1a5dfcf..e70d79e0 100644 --- a/test/unit/specs/index.spec.js +++ b/test/unit/specs/index.spec.js @@ -14,4 +14,4 @@ describe("module", () => { }); -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/test/unit/specs/util.js b/test/unit/specs/util.js index 0ba7acce..d704f204 100644 --- a/test/unit/specs/util.js +++ b/test/unit/specs/util.js @@ -1,18 +1,20 @@ import Vue from "vue"; export function trigger (el, event, args) { - let e = document.createEvent('HTMLEvents') - e.initEvent(event, true, false) + let e = document.createEvent("HTMLEvents"); + e.initEvent(event, true, false); if (args) { for (let prop in args) { - e[prop] = args[prop] + e[prop] = args[prop]; } } // Due to Firefox bug, events fired on disabled // non-attached form controls can throw errors - try { el.dispatchEvent(e) } catch (e) {} + try { el.dispatchEvent(e); } catch (e) { + // Ignored + } } export function createVueField(type, schema = {}, model = null, disabled = false, options) { @@ -30,5 +32,5 @@ export function createVueField(type, schema = {}, model = null, disabled = false }); let field = vm.$refs.field; - return [ el, vm, field ] + return [ el, vm, field ]; } \ No newline at end of file diff --git a/test/unit/specs/utils/schema.spec.js b/test/unit/specs/utils/schema.spec.js index e6bbf5ea..d91c112b 100644 --- a/test/unit/specs/utils/schema.spec.js +++ b/test/unit/specs/utils/schema.spec.js @@ -73,8 +73,8 @@ describe("SchemaUtils", () => { let models = [ { id: 1, name: "John", age: 25, status: true }, - { id: 2, name: "James", age: 30, status: true }, - ] + { id: 2, name: "James", age: 30, status: true } + ]; it("create merged model from multiple objects #1", () => { let res = SchemaUtils.mergeMultiObjectFields(schema, models); diff --git a/test/unit/specs/utils/validators.spec.js b/test/unit/specs/utils/validators.spec.js index 1033850b..4a3e88d2 100644 --- a/test/unit/specs/utils/validators.spec.js +++ b/test/unit/specs/utils/validators.spec.js @@ -19,7 +19,7 @@ describe("Validators", () => { min: 5, max: 10, required: true - } + }; it("should give error if value is null, but field is required", () => { check(v.number, null, field, 1); @@ -58,7 +58,7 @@ describe("Validators", () => { describe("test Validators.integer", () => { - let field = {} + let field = {}; it("should give error if value is not integer", () => { check(v.integer, 3.14, field, 1); @@ -75,7 +75,7 @@ describe("Validators", () => { describe("test Validators.double", () => { - let field = {} + let field = {}; it("should give error if value is not double", () => { check(v.double, "3,14", field, 1); @@ -94,7 +94,7 @@ describe("Validators", () => { required: true, min: 3, max: 10 - } + }; it("should give error if value is null, but field is required", () => { check(v.string, null, field, 1); @@ -135,7 +135,7 @@ describe("Validators", () => { required: true, min: 2, max: 4 - } + }; it("should give error if value is null, but field is required", () => { check(v.array, null, field, 1); @@ -183,7 +183,7 @@ describe("Validators", () => { required: true, min: 1262799081231, max: 1562799081231 - } + }; it("should give error if value is null, but field is required", () => { check(v.date, null, field, 1); @@ -222,7 +222,7 @@ describe("Validators", () => { let field = { required: true, pattern: /^[a-z0-9-]+$/g - } + }; it("should give error if value is null, but field is required", () => { check(v.regexp, null, field, 1); @@ -331,7 +331,7 @@ describe("Validators", () => { let field = { required: true - } + }; it("should give error if value is null, but field is required", () => { check(v.alpha, null, field, 1); @@ -363,7 +363,7 @@ describe("Validators", () => { let field = { required: true - } + }; it("should give error if value is null, but field is required", () => { check(v.alphaNumeric, null, field, 1);