From 911259d99593f768fbd0d2b39a58a816ad3cfe65 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 15:56:20 +0900 Subject: [PATCH 01/33] examples refactoring --- examples/package.json | 1 - examples/shared/custom-namespace.ts | 63 ++++++ examples/shared/default-namespace.ts | 138 +++++++++++++ .../namespaced-extended.ts | 2 +- examples/shared/validators.ts | 164 +++++++++++++++ examples/tsconfig.json | 18 +- examples/vite.config.js | 28 +++ examples/{vue-types.d.ts => vue.d.ts} | 0 examples/vue2/kitchensink/custom.ts | 77 ------- examples/vue2/kitchensink/index.ts | 182 ----------------- .../vue2/kitchensink/namespaced-extended.ts | 26 --- examples/vue2/kitchensink/single.ts | 119 ----------- examples/vue2/shape/index.html | 2 +- examples/vue2/shape/{src => }/index.ts | 0 .../.eslintrc.json | 0 examples/vue2/test-components/custom.ts | 21 ++ examples/vue2/test-components/index.ts | 52 +++++ examples/vue2/test-components/single.ts | 37 ++++ examples/vue2/userlist/index.html | 2 +- examples/vue2/userlist/{src => }/index.ts | 2 +- examples/vue3/kitchensink/custom.ts | 81 -------- examples/vue3/kitchensink/index.ts | 188 ------------------ examples/vue3/kitchensink/single.ts | 119 ----------- examples/vue3/shape/index.html | 2 +- examples/vue3/shape/{src => }/index.ts | 2 +- .../.eslintrc.json | 0 examples/vue3/test-components/custom.ts | 20 ++ examples/vue3/test-components/index.ts | 52 +++++ examples/vue3/test-components/single.ts | 38 ++++ examples/vue3/userlist/index.html | 2 +- examples/vue3/userlist/{src => }/index.ts | 2 +- package-lock.json | 19 ++ package.json | 1 + 33 files changed, 651 insertions(+), 809 deletions(-) delete mode 100644 examples/package.json create mode 100644 examples/shared/custom-namespace.ts create mode 100644 examples/shared/default-namespace.ts rename examples/{vue3/kitchensink => shared}/namespaced-extended.ts (90%) create mode 100644 examples/shared/validators.ts create mode 100644 examples/vite.config.js rename examples/{vue-types.d.ts => vue.d.ts} (100%) delete mode 100644 examples/vue2/kitchensink/custom.ts delete mode 100644 examples/vue2/kitchensink/index.ts delete mode 100644 examples/vue2/kitchensink/namespaced-extended.ts delete mode 100644 examples/vue2/kitchensink/single.ts rename examples/vue2/shape/{src => }/index.ts (100%) rename examples/vue2/{kitchensink => test-components}/.eslintrc.json (100%) create mode 100644 examples/vue2/test-components/custom.ts create mode 100644 examples/vue2/test-components/index.ts create mode 100644 examples/vue2/test-components/single.ts rename examples/vue2/userlist/{src => }/index.ts (95%) delete mode 100644 examples/vue3/kitchensink/custom.ts delete mode 100644 examples/vue3/kitchensink/index.ts delete mode 100644 examples/vue3/kitchensink/single.ts rename examples/vue3/shape/{src => }/index.ts (97%) rename examples/vue3/{kitchensink => test-components}/.eslintrc.json (100%) create mode 100644 examples/vue3/test-components/custom.ts create mode 100644 examples/vue3/test-components/index.ts create mode 100644 examples/vue3/test-components/single.ts rename examples/vue3/userlist/{src => }/index.ts (95%) diff --git a/examples/package.json b/examples/package.json deleted file mode 100644 index 8858ce53..00000000 --- a/examples/package.json +++ /dev/null @@ -1 +0,0 @@ -{ "name": "index"} diff --git a/examples/shared/custom-namespace.ts b/examples/shared/custom-namespace.ts new file mode 100644 index 00000000..b053a016 --- /dev/null +++ b/examples/shared/custom-namespace.ts @@ -0,0 +1,63 @@ +import { + createTypes, + object, + toValidableType, + fromType, + VueTypeValidableDef, + toType, +} from 'vue-types' + +interface User { + ID: number + name: string +} + +export const userShape = object() + +interface CustomVueTypes extends ReturnType { + readonly test: VueTypeValidableDef + readonly user: typeof userShape +} +export const MyTypes = createTypes({}).extend([ + { + name: 'test', + validate: true, + getter: true, + }, + { + name: 'user', + type: userShape, + getter: true, + }, +]) + +export const userType = MyTypes.object.def({ ID: 1, name: 'John' }) +export const userType2 = MyTypes.object.def(() => ({ ID: 1, name: 'John' })) +export const ageType = MyTypes.number.def(2).isRequired +export const strType = MyTypes.string.def('a') + +export const userAsShape = MyTypes.shape({ + ID: Number, + name: String, +}).def({ ID: 1 }) + +export const userGetterType = MyTypes.user.isRequired +export const customTestType = MyTypes.test.def('aaa') + +export const messageType = MyTypes.string + +export class MyTypesClass extends createTypes({}) { + static get test() { + return toValidableType('test', {}) + } + static get user() { + return fromType('user', userShape) + } + static get positive() { + return toType('positive', { type: Number, validator: (v) => v >= 0 }).def(0) + } +} + +export const userGetter2 = MyTypesClass.user.isRequired +export const stringT = MyTypesClass.string.isRequired +export const positiveT = MyTypesClass.positive.isRequired diff --git a/examples/shared/default-namespace.ts b/examples/shared/default-namespace.ts new file mode 100644 index 00000000..4cdd8670 --- /dev/null +++ b/examples/shared/default-namespace.ts @@ -0,0 +1,138 @@ +import VueTypes, { VueTypesInterface, VueTypeValidableDef } from 'vue-types' +import { VueTypesProject } from './namespaced-extended' + +const noop = (): void => undefined + +export const anyType = VueTypes.any +anyType.def(0) +anyType.def('string') + +export const boolType = VueTypes.bool.def(true).isRequired +export const funcType = VueTypes.func.def(noop).isRequired +export const arrayType = VueTypes.array.def([]).isRequired +export const arrayType2 = VueTypes.array.def(() => []).isRequired +export const stringType = VueTypes.string.def('John').isRequired +export const stringTypeValidate = VueTypes.string + .def('John') + .isRequired.validate((v: string): boolean => v === 'John') + +export const numberType = VueTypes.number.def(0).isRequired +export const integerType = VueTypes.integer.def(0).isRequired + +export const objectType = VueTypes.object.def({ demo: true }).isRequired +export const objectType2 = VueTypes.object.def(() => true).isRequired //FIXME: why this does not break? + +export interface Account { + name: string + ID: number +} + +export const userType = VueTypes.object.def({ + ID: 1, + name: 'me', +}) + +export const symbolType = VueTypes.symbol.def(Symbol('foo')).isRequired + +const validator = (v: number) => v > 18 +export const customType = VueTypes.custom(validator).def(0).isRequired + +export const customTypeStrict = + VueTypes.custom(validator).def(0).isRequired + +export const oneOf = VueTypes.oneOf([0, 'string', null]).def(2).isRequired + +export const oneOfStrict = VueTypes.oneOf([true, 'string'] as const).def( + 'string', +).isRequired + +class MyClass { + public test = 'testProp' +} + +const instance = new MyClass() + +export const instanceOfType = + VueTypes.instanceOf(MyClass).def(instance).isRequired +instanceOfType.type = MyClass + +export const oneOfTypeType = VueTypes.oneOfType([ + String, + { + type: String, + }, + VueTypes.number, +]) + +export const ArrayOfType = VueTypes.arrayOf(VueTypes.string).def([ + 'string', + 'string', +]).isRequired + +export const ObjectOfType = VueTypes.objectOf(VueTypes.string).def({ + prop: 'test', +}).isRequired + +export const ObjectOfType2 = VueTypes.objectOf( + VueTypes.oneOf([1, 2, 3] as const), +).def({ + prop: 1, +}).isRequired + +interface User { + name: string + surname: string + age: number + hobbies: any[] +} + +export const shapeType = VueTypes.shape({ + name: String, + surname: { type: String, default: 'Doe' }, + age: VueTypes.number, + hobbies: VueTypes.array, +}).def({ name: 'test', age: 100, hobbies: [true] }).isRequired + +export const shapeTypeLoose = VueTypes.shape({ + name: String, + surname: { type: String, default: 'Doe' }, + age: VueTypes.number, + hobbies: VueTypes.oneOf(['climbing', 'coding'] as const), +}).loose.def({ nationality: 'unknown' }).isRequired + +shapeType.type = Object + +VueTypes.sensibleDefaults = {} +VueTypes.sensibleDefaults = false +VueTypes.sensibleDefaults = true + +interface CustomVueTypes extends VueTypesInterface { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly test: VueTypeValidableDef + readonly user: typeof shapeType +} + +// extending +export const myTypes = VueTypes.extend([ + { + name: 'test', + validate: true, + getter: true, + }, + { + name: 'user', + type: shapeType, + getter: true, + }, +]) +;(VueTypes as CustomVueTypes).test.isRequired + +myTypes.test.isRequired +myTypes.test.isRequired + +export const a = myTypes.user.def({ name: 'xxx' }) +export const str = myTypes.string + +export const projectString = VueTypesProject.string.isRequired +export const pjMax = VueTypesProject.maxLength(2) +export const pjpositive = VueTypesProject.positive diff --git a/examples/vue3/kitchensink/namespaced-extended.ts b/examples/shared/namespaced-extended.ts similarity index 90% rename from examples/vue3/kitchensink/namespaced-extended.ts rename to examples/shared/namespaced-extended.ts index 85e6f6eb..04ab3a4b 100644 --- a/examples/vue3/kitchensink/namespaced-extended.ts +++ b/examples/shared/namespaced-extended.ts @@ -11,7 +11,7 @@ interface ProjectTypes extends VueTypesInterface { positive: VueTypeValidableDef } -export default VueTypes.extend([ +export const VueTypesProject = VueTypes.extend([ { name: 'maxLength', type: String, diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts new file mode 100644 index 00000000..83c5e0e1 --- /dev/null +++ b/examples/shared/validators.ts @@ -0,0 +1,164 @@ +import { + any, + func, + bool, + string, + number, + array, + object, + custom, + oneOf, + oneOfType, + arrayOf, + instanceOf, + objectOf, + shape, + toType, + fromType, +} from 'vue-types' + +/** + * `any` validator examples + */ +export const anyType = any() + +/** + * `func` validator examples + */ +type OnClick = (e: MouseEvent) => void +export const funcType = func().def((e: Event) => { + e.target +}) + +/** + * `bool` validator examples + */ +export const boolType = bool().isRequired +export const boolTypeDef = boolType.def(true) + +/** + * `string` validator examples + */ +enum IntsWords { + One = 'One', + Two = 'Two', +} +export const stringType = string().isRequired +export const stringUnionType = string<'one' | 'two'>().def('one') +export const stringEnumType = string().def(IntsWords.One) +export const stringEnumTypeTS41 = string<`${IntsWords}`>().def(IntsWords.One) +export const messageType = string().isRequired + +/** + * `number` validator examples + */ +export const numberType = number().isRequired +export const numberUnionType = number<1 | 2>().def(1) +export const ageType = number().isRequired.def(20).def(10) + +/** + * `array` validator examples + */ +export const arrayType = array().def([1, 2, 3]) +export const arrayStringType = array().def(['a']) + +/** + * `object` validator examples + */ +interface User { + ID: number + name: string +} +export const userType = object().def({ ID: 1, name: 'John' }) + +/** + * `custom` validator examples + */ +export const customType = custom( + (v) => typeof v === 'string' && v.length > 0, +) + +type Pair = [string, number] +export const tupleType = custom( + ([a, b]) => typeof a === 'string' && typeof b === 'number', +) + +/** + * `oneOf` validator examples + */ +export const oneOfTuple = oneOf([1, 2, 'string'] as const).def(1) + +/** + * `oneOfType` validator examples + */ +export const stringOrNumberOrBoolType = oneOfType([ + { type: String }, + Number, + bool(), +]) + +/** + * `arrayOf` validator examples + */ +export const arrayOfStringsType = arrayOf(string()) +export const arrayOfTypedStringsType = arrayOf(string<'one' | 'two'>()) +export const arrayofUsersType = arrayOf(userType) +export const arrayOfStringsType2 = arrayOf(String) +export const arrayOfMultipleType = arrayOf(stringOrNumberOrBoolType).def(['a']) +export const arrayOfVueProp = arrayOf({ type: [String, Number] }) + +/** + * `instanceOf` validator examples + */ +class Demo { + id = 10 +} +export const instanceOfDemo = instanceOf(Demo).def(() => new Demo()) +export const instanceOfDemo2 = instanceOf(Demo).def(new Demo()) + +/** + * `objectOf` validator examples + */ +export const objectOfString = objectOf(arrayOf(String)) +export const objectOfTuple = objectOf(tupleType) + +/** + * `shape` validator examples + */ + +export const userAsShape = shape({ ID: Number, name: string() }).def({ + ID: 1, + name: 'aaa', +}) + +export const userAsLooseShape = shape({ + ID: Number, + name: String, +}).loose.def({ + ID: 1, + name: 'aaa', + ops: true, +}) + +/** + * `toType` validator examples + */ +function minMax(min: number, max: number) { + return toType('minmax', { + type: Number, + validator(v) { + return v > min && v < max + }, + }) +} +export const scoreType = minMax(10, 200).isRequired + +/** + * `fromType` validator examples + */ + +export const looseClone = fromType('looseClone', userAsShape).loose +export const messageTypeClone = fromType('message', messageType) +export const messageTypeClone2 = fromType('message', messageType, { + default: 'sss', +}) diff --git a/examples/tsconfig.json b/examples/tsconfig.json index 5ae27555..5ea3e254 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -1,17 +1,19 @@ { "compilerOptions": { - "target": "ES5", + "target": "esnext", + "module": "esnext", + "lib": ["esnext", "dom"], + "resolveJsonModule": true, + "esModuleInterop": true, + "moduleResolution": "node", + "noEmit": true, + "jsx": "react", + "jsxFactory": "h", "baseUrl": "./", "paths": { "vue-types": ["../src/index.ts"], "vue-types/*": ["../src/*"] - }, - "esModuleInterop": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "strict": true, - "declaration": true, - "skipLibCheck": true + } }, "include": ["**/*.ts", "../src/**/*.ts"] } diff --git a/examples/vite.config.js b/examples/vite.config.js new file mode 100644 index 00000000..56f7b33d --- /dev/null +++ b/examples/vite.config.js @@ -0,0 +1,28 @@ +import { resolve, dirname } from 'path' +import { fileURLToPath } from 'url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +/** + * @type {import('vite').UserConfig} + */ +const config = { + server: { + fs: { + allow: ['..'], + }, + }, + resolve: { + alias: { + 'vue-types': [resolve(__dirname, '../src/index.ts')], + vue2: [ + resolve(__dirname, '../node_modules/vue2/dist/vue.esm.browser.js'), + ], + vue3: [ + resolve(__dirname, '../node_modules/vue3/dist/vue.esm-browser.js'), + ], + }, + }, +} + +export default config diff --git a/examples/vue-types.d.ts b/examples/vue.d.ts similarity index 100% rename from examples/vue-types.d.ts rename to examples/vue.d.ts diff --git a/examples/vue2/kitchensink/custom.ts b/examples/vue2/kitchensink/custom.ts deleted file mode 100644 index 7f0c998b..00000000 --- a/examples/vue2/kitchensink/custom.ts +++ /dev/null @@ -1,77 +0,0 @@ -import Vue from 'vue2' -import { - createTypes, - object, - toValidableType, - fromType, - VueTypeValidableDef, - toType, -} from 'vue-types' - -interface User { - ID: number - name: string -} - -const userShape = object() - -interface CustomVueTypes extends ReturnType { - readonly test: VueTypeValidableDef - readonly user: typeof userShape -} -const MyTypes = createTypes({}).extend([ - { - name: 'test', - validate: true, - getter: true, - }, - { - name: 'user', - type: userShape, - getter: true, - }, -]) - -const userType = MyTypes.object.def({ ID: 1, name: 'John' }) -const userType2 = MyTypes.object.def(() => ({ ID: 1, name: 'John' })) -const ageType = MyTypes.number.def(2).isRequired -const strType = MyTypes.string.def('a') - -const userAsShape = MyTypes.shape({ - ID: Number, - name: String, -}).def({ ID: 1 }) - -const userGetterType = MyTypes.user.isRequired -const customTestType = MyTypes.test.def('aaa') - -const messageType = MyTypes.string - -class MyTypesClass extends createTypes({}) { - static get test() { - return toValidableType('test', {}) - } - static get user() { - return fromType('user', userShape) - } - static get positive() { - return toType('positive', { type: Number, validator: (v) => v >= 0 }).def(0) - } -} - -const userGetter2 = MyTypesClass.user.isRequired -const stringT = MyTypesClass.string.isRequired -const positiveT = MyTypesClass.positive.isRequired - -const UserComponent = Vue.extend({ - props: { - user: userGetterType, - message: messageType, - age: ageType, - msg: stringT, - }, -}) - -new Vue({ - render: (h) => h(UserComponent), -}) diff --git a/examples/vue2/kitchensink/index.ts b/examples/vue2/kitchensink/index.ts deleted file mode 100644 index bba829dc..00000000 --- a/examples/vue2/kitchensink/index.ts +++ /dev/null @@ -1,182 +0,0 @@ -import Vue, { CreateElement } from 'vue2' -import VueTypes, { VueTypesInterface, VueTypeValidableDef } from 'vue-types' -import ProjectTypes from './namespaced-extended' - -const noop = (): void => undefined - -const anyType = VueTypes.any -anyType.def(0) -anyType.def('string') - -const boolType = VueTypes.bool.def(true).isRequired - -const funcType = VueTypes.func.def(noop).isRequired - -const arrayType = VueTypes.array.def([]).isRequired -const arrayType2 = VueTypes.array.def(() => []).isRequired - -const stringType = VueTypes.string.def('John').isRequired -const stringTypeValidate = VueTypes.string - .def('John') - .isRequired.validate((v: string | unknown): boolean => v === 'John') - -const numberType = VueTypes.number.def(0).isRequired -const integerType = VueTypes.integer.def(0).isRequired - -const objectType = VueTypes.object.def({ demo: true }).isRequired -const objectType2 = VueTypes.object.def(() => true).isRequired //FIXME: why this does not break? - -interface Account { - name: string - ID: number -} - -const userType = VueTypes.object.def({ - ID: 1, - name: 'me', -}) - -const symbolType = VueTypes.symbol.def(Symbol('foo')).isRequired - -const validator = (v: number) => v > 18 -const customType = VueTypes.custom(validator).def(0).isRequired - -const customTypeStrict = VueTypes.custom(validator).def(0).isRequired - -const oneOf = VueTypes.oneOf([0, 'string', null]).def(2).isRequired - -const oneOfStrict = VueTypes.oneOf([true, 'string'] as const).def( - 'string', -).isRequired - -class MyClass { - public test = 'testProp' -} - -const instance = new MyClass() - -const instanceOfType = VueTypes.instanceOf(MyClass).def(instance).isRequired -instanceOfType.type = MyClass - -const oneOfTypeType = VueTypes.oneOfType([ - String, - { - type: String, - }, - VueTypes.number, -]) - -const ArrayOfType = VueTypes.arrayOf(VueTypes.string).def([ - 'string', - 'string', -]).isRequired - -const ObjectOfType = VueTypes.objectOf(VueTypes.string).def({ - prop: 'test', -}).isRequired - -const ObjectOfType2 = VueTypes.objectOf(VueTypes.oneOf([1, 2, 3] as const)).def( - { - prop: 1, - }, -).isRequired - -interface User { - name: string - surname: string - age: number - hobbies: any[] -} - -const shapeType = VueTypes.shape({ - name: String, - surname: { type: String, default: 'Doe' }, - age: VueTypes.number, - hobbies: VueTypes.array, -}).def({ name: 'test', age: 100, hobbies: [true] }).isRequired - -const shapeTypeLoose = VueTypes.shape({ - name: String, - surname: { type: String, default: 'Doe' }, - age: VueTypes.number, - hobbies: VueTypes.oneOf(['climbing', 'coding'] as const), -}).loose.def({ nationality: 'unknown' }).isRequired - -shapeType.type = Object - -VueTypes.sensibleDefaults = {} -VueTypes.sensibleDefaults = false -VueTypes.sensibleDefaults = true - -interface CustomVueTypes extends VueTypesInterface { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly test: VueTypeValidableDef - readonly user: typeof shapeType -} - -// extending -const myTypes = VueTypes.extend([ - { - name: 'test', - validate: true, - getter: true, - }, - { - name: 'user', - type: shapeType, - getter: true, - }, -]) - -;(VueTypes as CustomVueTypes).test.isRequired - -myTypes.test.isRequired -myTypes.test.isRequired - -const a = myTypes.user.def({ name: 'xxx' }) -const str = myTypes.string - -const projectString = ProjectTypes.string.isRequired -const pjMax = ProjectTypes.maxLength(2) -const pjpositive = ProjectTypes.positive - -const NativeComponent = Vue.extend({ - props: { - verified: boolType, - funcProp: funcType, - hobbies: arrayType, - name: stringType, - height: numberType, - age: integerType, - obj: objectType, - obj2: objectType2, - uniqueSym: symbolType, - }, -}) - -const OtherTypesComponent = Vue.extend({ - props: { - friends: ArrayOfType, - user: userType, - ageLimit: customTypeStrict, - colors: VueTypes.oneOf(['red', 'blue']), - userType: instanceOfType, - fieldWithText: VueTypes.oneOfType([String, VueTypes.string]), - friendsId: VueTypes.arrayOf(VueTypes.number).isRequired, - simpleObj: ObjectOfType, - meta: shapeType, - extendedMeta: shapeTypeLoose, - }, -}) - -new Vue({ render: (h) => h(OtherTypesComponent) }) - -new Vue({ - render: (h: CreateElement) => - h(OtherTypesComponent, { - props: { - verified: true, - user: { ID: 10, name: 'me' }, - }, - }), -}) diff --git a/examples/vue2/kitchensink/namespaced-extended.ts b/examples/vue2/kitchensink/namespaced-extended.ts deleted file mode 100644 index 85e6f6eb..00000000 --- a/examples/vue2/kitchensink/namespaced-extended.ts +++ /dev/null @@ -1,26 +0,0 @@ -import VueTypes, { - VueTypesInterface, - VueTypeDef, - VueTypeValidableDef, -} from 'vue-types' - -interface ProjectTypes extends VueTypesInterface { - //VueTypeDef accepts the prop expected type as argument - maxLength(max: number): VueTypeDef - // use VueTypeValidableDef if the new type is going to support the `validate` method. - positive: VueTypeValidableDef -} - -export default VueTypes.extend([ - { - name: 'maxLength', - type: String, - validator: (max: number, v: string) => v.length <= max, - }, - { - name: 'positive', - getter: true, - type: Number, - validator: (v: number) => v > 0, - }, -]) diff --git a/examples/vue2/kitchensink/single.ts b/examples/vue2/kitchensink/single.ts deleted file mode 100644 index f5b5d27f..00000000 --- a/examples/vue2/kitchensink/single.ts +++ /dev/null @@ -1,119 +0,0 @@ -import Vue from 'vue2' -import { - any, - func, - bool, - string, - number, - array, - object, - custom, - oneOf, - oneOfType, - arrayOf, - instanceOf, - objectOf, - shape, - toType, - fromType, -} from 'vue-types' - -interface User { - ID: number - name: string -} - -function minMax(min: number, max: number) { - return toType('minmax', { - type: Number, - validator(v) { - return v > min && v < max - }, - }) -} - -class Demo { - id = 10 -} - -const instanceOfDemo = instanceOf(Demo).def(() => new Demo()) -const instanceOfDemo2 = instanceOf(Demo).def(new Demo()) - -type OnClick = (e: MouseEvent) => void -const funcType = func().def((e: Event) => { - e.target -}) - -const anyType = any() - -const userType = object().def({ ID: 1, name: 'John' }) -const ageType = number().isRequired.def(20).def(10) - -const customType = custom((v) => typeof v === 'string' && v.length > 0) - -const userAsShape = shape({ ID: Number, name: string() }).def({ - ID: 1, - name: 'aaa', -}) - -const userAsLooseShape = shape({ ID: Number, name: String }).loose.def({ - ID: 1, - name: 'aaa', - ops: true, -}) - -const looseClone = fromType('looseClone', userAsShape).loose - -const messageType = string().isRequired - -const messageTypeClone = fromType('message', messageType) -const messageTypeClone2 = fromType('message', messageType, { - default: 'sss', -}) - -const stringOrNumberOrBoolType = oneOfType([{ type: String }, Number, bool()]) - -const arrayType = array().def([1, 2, 3]) -const arrayStringType = array().def(['a']) -const arrayOfStringsType = arrayOf(string()) -const arrayofUsersType = arrayOf(userType) -const arrayOfStringsType2 = arrayOf(String) -const arrayOfMultipleType = arrayOf(stringOrNumberOrBoolType).def(['a']) -const arrayOfVueProp = arrayOf({ type: [String, Number] }) - -const scoreType = minMax(10, 200).isRequired - -const objectOfString = objectOf(arrayOf(String)) - -type Pair = [string, number] - -const tupleType = custom( - ([a, b]) => typeof a === 'string' && typeof b === 'number', -) -const objectOfTuple = objectOf(tupleType) - -const oneOfTuple = oneOf([1, 2, 'string'] as const).def(1) - -const UserComponent = Vue.extend({ - props: { - user: userType, - message: messageType, - age: ageType, - hobbies: arrayOfStringsType, - randomData: arrayOfMultipleType, - score: scoreType, - }, -}) - -const UserProfile = Vue.extend({ - props: { - onClick: funcType, - action: anyType, - tupleObj: objectOfTuple, - oneOf: oneOfTuple, - }, -}) - -new Vue({ - render: (h) => h(UserComponent), -}) diff --git a/examples/vue2/shape/index.html b/examples/vue2/shape/index.html index e810075d..229c0a4c 100644 --- a/examples/vue2/shape/index.html +++ b/examples/vue2/shape/index.html @@ -12,6 +12,6 @@
- + diff --git a/examples/vue2/shape/src/index.ts b/examples/vue2/shape/index.ts similarity index 100% rename from examples/vue2/shape/src/index.ts rename to examples/vue2/shape/index.ts diff --git a/examples/vue2/kitchensink/.eslintrc.json b/examples/vue2/test-components/.eslintrc.json similarity index 100% rename from examples/vue2/kitchensink/.eslintrc.json rename to examples/vue2/test-components/.eslintrc.json diff --git a/examples/vue2/test-components/custom.ts b/examples/vue2/test-components/custom.ts new file mode 100644 index 00000000..c77ab1e5 --- /dev/null +++ b/examples/vue2/test-components/custom.ts @@ -0,0 +1,21 @@ +import Vue from 'vue2' + +import { + userGetterType, + messageType, + ageType, + stringT, +} from '../../shared/custom-namespace' + +const UserComponent = Vue.extend({ + props: { + user: userGetterType, + message: messageType, + age: ageType, + msg: stringT, + }, +}) + +new Vue({ + render: (h) => h(UserComponent), +}) diff --git a/examples/vue2/test-components/index.ts b/examples/vue2/test-components/index.ts new file mode 100644 index 00000000..331b1f43 --- /dev/null +++ b/examples/vue2/test-components/index.ts @@ -0,0 +1,52 @@ +import Vue, { CreateElement } from 'vue2' +import VueTypes from 'vue-types' +import { + boolType, + funcType, + arrayType, + stringType, + numberType, + integerType, + objectType, + objectType2, + symbolType, + ArrayOfType, + userType, + instanceOfType, + customTypeStrict, + ObjectOfType, + shapeTypeLoose, + shapeType, +} from '../../shared/default-namespace' + +const NativeComponent = Vue.extend({ + props: { + verified: boolType, + funcProp: funcType, + hobbies: arrayType, + name: stringType, + height: numberType, + age: integerType, + obj: objectType, + obj2: objectType2, + uniqueSym: symbolType, + }, +}) + +const OtherTypesComponent = Vue.extend({ + props: { + friends: ArrayOfType, + user: userType, + ageLimit: customTypeStrict, + colors: VueTypes.oneOf(['red', 'blue']), + userType: instanceOfType, + fieldWithText: VueTypes.oneOfType([String, VueTypes.string]), + friendsId: VueTypes.arrayOf(VueTypes.number).isRequired, + simpleObj: ObjectOfType, + meta: shapeType, + extendedMeta: shapeTypeLoose, + }, +}) + +new Vue({ render: (h) => h(NativeComponent) }) +new Vue({ render: (h) => h(OtherTypesComponent) }) diff --git a/examples/vue2/test-components/single.ts b/examples/vue2/test-components/single.ts new file mode 100644 index 00000000..c2c88258 --- /dev/null +++ b/examples/vue2/test-components/single.ts @@ -0,0 +1,37 @@ +import Vue from 'vue2' +import { + userType, + messageType, + ageType, + arrayOfStringsType, + arrayOfMultipleType, + scoreType, + funcType, + anyType, + objectOfTuple, + oneOfTuple, +} from '../../shared/validators' + +const UserComponent = Vue.extend({ + props: { + user: userType, + message: messageType, + age: ageType, + hobbies: arrayOfStringsType, + randomData: arrayOfMultipleType, + score: scoreType, + }, +}) + +const UserProfile = Vue.extend({ + props: { + onClick: funcType, + action: anyType, + tupleObj: objectOfTuple, + oneOf: oneOfTuple, + }, +}) + +new Vue({ + render: (h) => h(UserComponent), +}) diff --git a/examples/vue2/userlist/index.html b/examples/vue2/userlist/index.html index e810075d..229c0a4c 100644 --- a/examples/vue2/userlist/index.html +++ b/examples/vue2/userlist/index.html @@ -12,6 +12,6 @@
- + diff --git a/examples/vue2/userlist/src/index.ts b/examples/vue2/userlist/index.ts similarity index 95% rename from examples/vue2/userlist/src/index.ts rename to examples/vue2/userlist/index.ts index 62df81b5..521075f8 100644 --- a/examples/vue2/userlist/src/index.ts +++ b/examples/vue2/userlist/index.ts @@ -1,5 +1,5 @@ import Vue from 'vue2' -import VueTypes, { VueTypeDef } from 'vue-types' +import VueTypes, { VueTypeDef } from '../../../src' type typeofVueTypes = typeof VueTypes interface VueTypesCustom extends typeofVueTypes { diff --git a/examples/vue3/kitchensink/custom.ts b/examples/vue3/kitchensink/custom.ts deleted file mode 100644 index c77449a5..00000000 --- a/examples/vue3/kitchensink/custom.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { defineComponent, createApp, h } from 'vue3' -import { - createTypes, - object, - toValidableType, - fromType, - VueTypeValidableDef, - toType, -} from 'vue-types' - -interface User { - ID: number - name: string -} - -const userShape = object() - -interface CustomVueTypes extends ReturnType { - readonly test: VueTypeValidableDef - readonly user: typeof userShape -} -const MyTypes = createTypes({}).extend([ - { - name: 'test', - validate: true, - getter: true, - }, - { - name: 'user', - type: userShape, - getter: true, - }, -]) - -const userType = MyTypes.object.def({ ID: 1, name: 'John' }) -const userType2 = MyTypes.object.def(() => ({ ID: 1, name: 'John' })) -const ageType = MyTypes.number.def(2).isRequired -const strType = MyTypes.string.def('a') - -const userAsShape = MyTypes.shape({ - ID: Number, - name: String, -}).def({ ID: 1 }) - -const userGetterType = MyTypes.user.isRequired -const customTestType = MyTypes.test.def('aaa') - -const messageType = MyTypes.string - -class MyTypesClass extends createTypes({}) { - static get test() { - return toValidableType('test', {}) - } - static get user() { - return fromType('user', userShape) - } - static get positive() { - return toValidableType('positive', { - type: Number, - }) - .validate((v) => (v as number) >= 0) - .def(0) - } -} - -const userGetter2 = MyTypesClass.user.isRequired -const stringT = MyTypesClass.string.isRequired -const positiveT = MyTypesClass.positive.isRequired - -const UserComponent = defineComponent({ - props: { - user: userGetterType, - message: messageType, - age: ageType, - msg: stringT, - }, -}) - -createApp({ - render: () => h(UserComponent), -}) diff --git a/examples/vue3/kitchensink/index.ts b/examples/vue3/kitchensink/index.ts deleted file mode 100644 index 527eff26..00000000 --- a/examples/vue3/kitchensink/index.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { defineComponent, createApp, h } from 'vue3' -// import Component from 'vue-class-component' -import VueTypes, { VueTypesInterface, VueTypeValidableDef } from 'vue-types' -import ProjectTypes from './namespaced-extended' - -const noop = (): void => undefined - -const anyType = VueTypes.any -anyType.def(0) -anyType.def('string') - -const boolType = VueTypes.bool.def(true).isRequired - -const funcType = VueTypes.func.def(noop).isRequired - -const arrayType = VueTypes.array.def([]).isRequired -const arrayType2 = VueTypes.array.def(() => []).isRequired - -const stringType = VueTypes.string.def('John').isRequired -const stringTypeValidate = VueTypes.string - .def('John') - .isRequired.validate((v: string | unknown): boolean => v === 'John') - -const numberType = VueTypes.number.def(0).isRequired -const integerType = VueTypes.integer.def(0).isRequired - -const objectType = VueTypes.object.def({ demo: true }).isRequired -const objectType2 = VueTypes.object.def(() => true).isRequired //FIXME: why this does not break? - -interface Account { - name: string - ID: number -} - -const userType = VueTypes.object.def({ - ID: 1, - name: 'me', -}) - -const symbolType = VueTypes.symbol.def(Symbol('foo')).isRequired - -const validator = (v: number) => v > 18 -const customType = VueTypes.custom(validator).def(0).isRequired - -const customTypeStrict = VueTypes.custom(validator).def(0).isRequired - -const oneOf = VueTypes.oneOf([0, 'string', null]).def(2).isRequired - -const oneOfStrict = VueTypes.oneOf([true, 'string'] as const).def( - 'string', -).isRequired - -class MyClass { - public test = 'testProp' -} - -const instance = new MyClass() - -const instanceOfType = VueTypes.instanceOf(MyClass).def(instance).isRequired -instanceOfType.type = MyClass - -const oneOfTypeType = VueTypes.oneOfType([ - String, - { - type: String, - }, - VueTypes.number, -]) - -const ArrayOfType = VueTypes.arrayOf(VueTypes.string).def([ - 'string', - 'string', -]).isRequired - -const ObjectOfType = VueTypes.objectOf(VueTypes.string).def({ - prop: 'test', -}).isRequired - -const ObjectOfType2 = VueTypes.objectOf(VueTypes.oneOf([1, 2, 3] as const)).def( - { - prop: 1, - }, -).isRequired - -interface User { - name: string - surname: string - age: number - hobbies: any[] -} - -const shapeType = VueTypes.shape({ - name: String, - surname: { type: String, default: 'Doe' }, - age: VueTypes.number, - hobbies: VueTypes.array, -}).def({ name: 'test', age: 100, hobbies: [true] }).isRequired - -const shapeTypeLoose = VueTypes.shape({ - name: String, - surname: { type: String, default: 'Doe' }, - age: VueTypes.number, - hobbies: VueTypes.oneOf(['climbing', 'coding'] as const), -}).loose.def({ nationality: 'unknown' }).isRequired - -shapeType.type = Object - -VueTypes.sensibleDefaults = {} -VueTypes.sensibleDefaults = false -VueTypes.sensibleDefaults = true - -interface CustomVueTypes extends VueTypesInterface { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly test: VueTypeValidableDef - readonly user: typeof shapeType -} - -// extending -const myTypes = VueTypes.extend([ - { - name: 'test', - validate: true, - getter: true, - }, - { - name: 'user', - type: shapeType, - getter: true, - }, -]) - -;(VueTypes as CustomVueTypes).test.isRequired - -myTypes.test.isRequired -myTypes.test.isRequired - -const a = myTypes.user.def({ name: 'xxx' }) -const str = myTypes.string - -const projectString = ProjectTypes.string.isRequired -const pjMax = ProjectTypes.maxLength(2) -const pjpositive = ProjectTypes.positive - -const NativeComponent = defineComponent({ - props: { - verified: boolType, - funcProp: funcType, - hobbies: arrayType, - name: stringType, - height: numberType, - age: integerType, - obj: objectType, - obj2: objectType2, - uniqueSym: symbolType, - }, -}) - -const OtherTypesComponent = defineComponent({ - props: { - friends: ArrayOfType, - user: userType, - ageLimit: customTypeStrict, - colors: VueTypes.oneOf(['red', 'blue']), - userType: instanceOfType, - fieldWithText: VueTypes.oneOfType([String, VueTypes.string]), - friendsId: VueTypes.arrayOf(VueTypes.number).isRequired, - simpleObj: ObjectOfType, - meta: shapeType, - extendedMeta: shapeTypeLoose, - }, -}) - -createApp({ render: () => h(OtherTypesComponent) }) - -// @Component -// class ClassComponent extends NativeComponent { -// public msg = 10 -// } - -// new Vue({ -// render: (h: CreateElement) => -// h(ClassComponent, { -// props: { -// verified: true, -// user: { ID: 10, name: 'me' }, -// }, -// }), -// }) diff --git a/examples/vue3/kitchensink/single.ts b/examples/vue3/kitchensink/single.ts deleted file mode 100644 index 742c3bfd..00000000 --- a/examples/vue3/kitchensink/single.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { defineComponent, createApp, h } from 'vue3' -import { - any, - func, - bool, - string, - number, - array, - object, - custom, - oneOf, - oneOfType, - arrayOf, - instanceOf, - objectOf, - shape, - toType, - fromType, -} from 'vue-types' - -interface User { - ID: number - name: string -} - -function minMax(min: number, max: number) { - return toType('minmax', { - type: Number, - validator(v) { - return v > min && v < max - }, - }) -} - -class Demo { - id = 10 -} - -const instanceOfDemo = instanceOf(Demo).def(() => new Demo()) -const instanceOfDemo2 = instanceOf(Demo).def(new Demo()) - -type OnClick = (e: MouseEvent) => void -const funcType = func().def((e: Event) => { - e.target -}) - -const anyType = any() - -const userType = object().def({ ID: 1, name: 'John' }) -const ageType = number().isRequired.def(20).def(10) - -const customType = custom((v) => typeof v === 'string' && v.length > 0) - -const userAsShape = shape({ ID: Number, name: string() }).def({ - ID: 1, - name: 'aaa', -}) - -const userAsLooseShape = shape({ ID: Number, name: String }).loose.def({ - ID: 1, - name: 'aaa', - ops: true, -}) - -const looseClone = fromType('looseClone', userAsShape).loose - -const messageType = string().isRequired - -const messageTypeClone = fromType('message', messageType) -const messageTypeClone2 = fromType('message', messageType, { - default: 'sss', -}) - -const stringOrNumberOrBoolType = oneOfType([{ type: String }, Number, bool()]) - -const arrayType = array().def([1, 2, 3]) -const arrayStringType = array().def(['a']) -const arrayOfStringsType = arrayOf(string()) -const arrayofUsersType = arrayOf(userType) -const arrayOfStringsType2 = arrayOf(String) -const arrayOfMultipleType = arrayOf(stringOrNumberOrBoolType).def(['a']) -const arrayOfVueProp = arrayOf({ type: [String, Number] }) - -const scoreType = minMax(10, 200).isRequired - -const objectOfString = objectOf(arrayOf(String)) - -type Pair = [string, number] - -const tupleType = custom( - ([a, b]) => typeof a === 'string' && typeof b === 'number', -) -const objectOfTuple = objectOf(tupleType) - -const oneOfTuple = oneOf([1, 2, 'string'] as const).def(1) - -const UserComponent = defineComponent({ - props: { - user: userType, - message: messageType, - age: ageType, - hobbies: arrayOfStringsType, - randomData: arrayOfMultipleType, - score: scoreType, - }, -}) - -const UserProfile = defineComponent({ - props: { - onClick: funcType, - action: anyType, - tupleObj: objectOfTuple, - oneOf: oneOfTuple, - }, -}) - -createApp({ - render: () => h(UserComponent), -}) diff --git a/examples/vue3/shape/index.html b/examples/vue3/shape/index.html index e810075d..229c0a4c 100644 --- a/examples/vue3/shape/index.html +++ b/examples/vue3/shape/index.html @@ -12,6 +12,6 @@
- + diff --git a/examples/vue3/shape/src/index.ts b/examples/vue3/shape/index.ts similarity index 97% rename from examples/vue3/shape/src/index.ts rename to examples/vue3/shape/index.ts index 5cae7d72..f1b5aa73 100644 --- a/examples/vue3/shape/src/index.ts +++ b/examples/vue3/shape/index.ts @@ -1,5 +1,5 @@ import { defineComponent, createApp, h, computed, ref } from 'vue3' -import VueTypes from 'vue-types' +import VueTypes from '../../../src' interface ModelItem { id: string diff --git a/examples/vue3/kitchensink/.eslintrc.json b/examples/vue3/test-components/.eslintrc.json similarity index 100% rename from examples/vue3/kitchensink/.eslintrc.json rename to examples/vue3/test-components/.eslintrc.json diff --git a/examples/vue3/test-components/custom.ts b/examples/vue3/test-components/custom.ts new file mode 100644 index 00000000..0e18d949 --- /dev/null +++ b/examples/vue3/test-components/custom.ts @@ -0,0 +1,20 @@ +import { defineComponent, createApp, h } from 'vue3' + +import { + userGetterType, + messageType, + ageType, + stringT, +} from '../../shared/custom-namespace' +const UserComponent = defineComponent({ + props: { + user: userGetterType, + message: messageType, + age: ageType, + msg: stringT, + }, +}) + +createApp({ + render: () => h(UserComponent), +}) diff --git a/examples/vue3/test-components/index.ts b/examples/vue3/test-components/index.ts new file mode 100644 index 00000000..62bf3b41 --- /dev/null +++ b/examples/vue3/test-components/index.ts @@ -0,0 +1,52 @@ +import { defineComponent, createApp, h } from 'vue3' +import VueTypes from 'vue-types' +import { + boolType, + funcType, + arrayType, + stringType, + numberType, + integerType, + objectType, + objectType2, + symbolType, + ArrayOfType, + userType, + instanceOfType, + customTypeStrict, + ObjectOfType, + shapeTypeLoose, + shapeType, +} from '../../shared/default-namespace' + +const NativeComponent = defineComponent({ + props: { + verified: boolType, + funcProp: funcType, + hobbies: arrayType, + name: stringType, + height: numberType, + age: integerType, + obj: objectType, + obj2: objectType2, + uniqueSym: symbolType, + }, +}) + +const OtherTypesComponent = defineComponent({ + props: { + friends: ArrayOfType, + user: userType, + ageLimit: customTypeStrict, + colors: VueTypes.oneOf(['red', 'blue']), + userType: instanceOfType, + fieldWithText: VueTypes.oneOfType([String, VueTypes.string]), + friendsId: VueTypes.arrayOf(VueTypes.number).isRequired, + simpleObj: ObjectOfType, + meta: shapeType, + extendedMeta: shapeTypeLoose, + }, +}) + +createApp({ render: () => h(OtherTypesComponent) }) +createApp({ render: () => h(NativeComponent) }) diff --git a/examples/vue3/test-components/single.ts b/examples/vue3/test-components/single.ts new file mode 100644 index 00000000..2205d924 --- /dev/null +++ b/examples/vue3/test-components/single.ts @@ -0,0 +1,38 @@ +import { defineComponent, createApp, h } from 'vue3' + +import { + userType, + messageType, + ageType, + arrayOfStringsType, + arrayOfMultipleType, + scoreType, + funcType, + anyType, + objectOfTuple, + oneOfTuple, +} from '../../shared/validators' + +const UserComponent = defineComponent({ + props: { + user: userType, + message: messageType, + age: ageType, + hobbies: arrayOfStringsType, + randomData: arrayOfMultipleType, + score: scoreType, + }, +}) + +const UserProfile = defineComponent({ + props: { + onClick: funcType, + action: anyType, + tupleObj: objectOfTuple, + oneOf: oneOfTuple, + }, +}) + +createApp({ + render: () => h(UserComponent), +}) diff --git a/examples/vue3/userlist/index.html b/examples/vue3/userlist/index.html index e810075d..229c0a4c 100644 --- a/examples/vue3/userlist/index.html +++ b/examples/vue3/userlist/index.html @@ -12,6 +12,6 @@
- + diff --git a/examples/vue3/userlist/src/index.ts b/examples/vue3/userlist/index.ts similarity index 95% rename from examples/vue3/userlist/src/index.ts rename to examples/vue3/userlist/index.ts index ff0f85b1..e35d4a23 100644 --- a/examples/vue3/userlist/src/index.ts +++ b/examples/vue3/userlist/index.ts @@ -1,5 +1,5 @@ import { defineComponent, createApp, h } from 'vue3' -import VueTypes, { VueTypeDef } from 'vue-types' +import VueTypes, { VueTypeDef } from '../../../src' type typeofVueTypes = typeof VueTypes interface VueTypesCustom extends typeofVueTypes { diff --git a/package-lock.json b/package-lock.json index 0f3ba074..73cb230b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8643,6 +8643,12 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, + "esbuild": { + "version": "0.12.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.15.tgz", + "integrity": "sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -21635,6 +21641,19 @@ "extsprintf": "^1.2.0" } }, + "vite": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.4.1.tgz", + "integrity": "sha512-4BpKRis9uxIqPfIEcJ18LTBsamqnDFxTx45CXwagHjNltHa6PFEvf8Pe6OpgIHb0OyWT30OXOSSQvdOaX4OBiQ==", + "dev": true, + "requires": { + "esbuild": "^0.12.8", + "fsevents": "~2.3.2", + "postcss": "^8.3.5", + "resolve": "^1.20.0", + "rollup": "^2.38.5" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", diff --git a/package.json b/package.json index f5a488e8..1924c33a 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "prettier": "2.3.2", "ts-jest": "27.0.3", "typescript": "4.3.5", + "vite": "2.4.1", "vue2": "npm:vue@2.6.14", "vue3": "npm:vue@3.1.4", "vuepress": "1.8.2" From b5d4a0883f30148748c77b93f4bef3773af257f6 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 15:58:01 +0900 Subject: [PATCH 02/33] remove unused dep --- package-lock.json | 865 +-------------------------------------- package.json | 1 - scripts/run-examples.cjs | 40 -- 3 files changed, 5 insertions(+), 901 deletions(-) delete mode 100644 scripts/run-examples.cjs diff --git a/package-lock.json b/package-lock.json index 73cb230b..7c2fbdf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4326,12 +4326,6 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -4596,12 +4590,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -4655,24 +4643,12 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -4732,15 +4708,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dev": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, "babel-jest": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", @@ -4952,12 +4919,6 @@ "babel-preset-current-node-syntax": "^1.0.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5019,24 +4980,12 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5062,7 +5011,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "dev": true, + "optional": true }, "bindings": { "version": "1.5.0", @@ -5074,12 +5024,6 @@ "file-uri-to-path": "1.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -5288,70 +5232,6 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-sync": { - "version": "2.27.4", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.4.tgz", - "integrity": "sha512-zgjrI6oUXxLa671SxVmWfIH+XiG6yZiGuvsQ1huuGEBlKkWuBVKgYjh+j9kagKm891FARgmK4Ct4PAhckLKaYg==", - "dev": true, - "requires": { - "browser-sync-client": "^2.27.4", - "browser-sync-ui": "^2.27.4", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "2.4.0", - "ua-parser-js": "^0.7.28", - "yargs": "^15.4.1" - } - }, - "browser-sync-client": { - "version": "2.27.4", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.4.tgz", - "integrity": "sha512-l0krAGZnpLaD+tUYdM25WeS4FP73ZoPeaxlVzOvmtL9uKSlvpmywsnDwa3PJzc3ubmDPAcD74ifJjl6MmVksXw==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6" - } - }, - "browser-sync-ui": { - "version": "2.27.4", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.4.tgz", - "integrity": "sha512-E58Mb6ycz57Nm393oqVJj4jxuLJH3MhZnY8AV+zd9LsNVGZjrKRNNIw5JPYYguyb37ZjLjq2x4u+38mRv3Sb7g==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^2.4.0", - "stream-throttle": "^0.1.3" - } - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -5460,18 +5340,6 @@ "fast-json-stable-stringify": "2.x" } }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -5819,6 +5687,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, + "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -6111,24 +5980,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6231,35 +6088,6 @@ "xdg-basedir": "^4.0.0" } }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -6333,12 +6161,6 @@ } } }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -8157,12 +7979,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, "diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -8197,12 +8013,6 @@ "path-type": "^4.0.0" } }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -8360,24 +8170,6 @@ "stream-shift": "^1.0.0" } }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", - "dev": true, - "requires": { - "tfunk": "^4.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -8456,80 +8248,6 @@ "once": "^1.4.0" } }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -9616,38 +9334,6 @@ "to-regex-range": "^5.0.1" } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -9767,17 +9453,6 @@ "readable-stream": "^2.0.0" } }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -10060,21 +9735,6 @@ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -10649,12 +10309,6 @@ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", "dev": true }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, "import-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", @@ -10764,12 +10418,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -10878,6 +10526,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "optional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -11061,15 +10710,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, "is-number-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", @@ -13372,15 +13012,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -13467,12 +13098,6 @@ "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", "dev": true }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -13552,35 +13177,6 @@ } } }, - "localtunnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz", - "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", - "dev": true, - "requires": { - "axios": "0.21.1", - "debug": "4.3.1", - "openurl": "1.1.1", - "yargs": "16.2.0" - }, - "dependencies": { - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -13620,12 +13216,6 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", - "dev": true - }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -14079,12 +13669,6 @@ } } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, "mime-db": { "version": "1.48.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", @@ -14216,12 +13800,6 @@ "through2": "^2.0.0" } }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -14954,21 +14532,6 @@ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, "optimize-css-assets-webpack-plugin": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.6.tgz", @@ -15300,18 +14863,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15473,16 +15024,6 @@ } } }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "is-number-like": "^1.0.3" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -18534,12 +18075,6 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", @@ -18606,18 +18141,6 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -18717,6 +18240,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, + "optional": true, "requires": { "picomatch": "^2.2.1" } @@ -19004,33 +18528,6 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -19268,21 +18765,6 @@ "aproba": "^1.1.1" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, "sade": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", @@ -19407,74 +18889,6 @@ } } }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -19546,24 +18960,6 @@ } } }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -19830,118 +19226,6 @@ } } }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -20204,12 +19488,6 @@ } } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, "std-env": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", @@ -20235,16 +19513,6 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -20678,12 +19946,6 @@ } } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -20914,16 +20176,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, "throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -20983,12 +20235,6 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -21205,12 +20451,6 @@ "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "dev": true }, - "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", - "dev": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -23271,12 +22511,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -23301,101 +22535,12 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "yargs-parser": { "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", "dev": true }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 1924c33a..5ce2277a 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,6 @@ "@typescript-eslint/eslint-plugin": "4.28.3", "@typescript-eslint/parser": "4.28.3", "babel-plugin-transform-node-env-inline": "0.4.3", - "browser-sync": "2.27.4", "cpy-cli": "3.1.1", "cross-env": "7.0.3", "del": "6.0.0", diff --git a/scripts/run-examples.cjs b/scripts/run-examples.cjs deleted file mode 100644 index bbf24c25..00000000 --- a/scripts/run-examples.cjs +++ /dev/null @@ -1,40 +0,0 @@ -const { join, resolve } = require('path') -const microbundle = require('microbundle') -const bs = require('browser-sync').create() -const del = require('del') - -;(async function () { - const ROOT_DIR = resolve(__dirname, '../examples') - - process.env.NODE_ENV = 'development' - - console.log('Compiling examples...') - - const bundles = [ - 'vue2/userlist', - 'vue2/shape', - 'vue3/userlist', - 'vue3/shape', - ].map(async (path) => { - await del(resolve(ROOT_DIR, `./${path}/dist`)) - - await microbundle({ - entries: [join(ROOT_DIR, `./${path}/src/index.ts`)], - output: `./${path}/dist`, - tsconfig: join(ROOT_DIR, './tsconfig.json'), - cwd: ROOT_DIR, - watch: true, - format: 'iife', - compress: false, - define: 'process.env.NODE_ENV="development"', - alias: 'vue2=vue2/dist/vue.esm.js,vue3=vue3/dist/vue.esm-browser.js', - }) - }) - - await Promise.all(bundles) - - bs.init({ - server: ROOT_DIR, - files: `${ROOT_DIR}/**/*.js`, - }) -})() From 6e9c794ee4245dbe56e9cdec48eaceef188f4d0a Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 15:58:34 +0900 Subject: [PATCH 03/33] add ts argument for number and integer --- src/validators/native.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/validators/native.ts b/src/validators/native.ts index d0b4bc5a..2d0803af 100644 --- a/src/validators/native.ts +++ b/src/validators/native.ts @@ -18,9 +18,9 @@ export const string = () => type: String as unknown as PropType, }) -export const number = () => - toValidableType('number', { - type: Number, +export const number = () => + toValidableType('number', { + type: Number as unknown as PropType, }) export const array = () => @@ -33,9 +33,9 @@ export const object = () => type: Object, }) -export const integer = () => - toType('integer', { - type: Number, +export const integer = () => + toType('integer', { + type: Number as unknown as PropType, validator(value) { return isInteger(value) }, From 9efa59fd1beb7c58a8d08740a596708fcdcf7b1f Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 16:05:55 +0900 Subject: [PATCH 04/33] linting --- examples/shared/custom-namespace.ts | 1 + examples/vue2/test-components/index.ts | 2 +- examples/vue2/test-components/single.ts | 4 ++++ examples/vue3/test-components/single.ts | 3 +++ package.json | 5 +++-- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/shared/custom-namespace.ts b/examples/shared/custom-namespace.ts index b053a016..de20f7b2 100644 --- a/examples/shared/custom-namespace.ts +++ b/examples/shared/custom-namespace.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { createTypes, object, diff --git a/examples/vue2/test-components/index.ts b/examples/vue2/test-components/index.ts index 331b1f43..9bc0b624 100644 --- a/examples/vue2/test-components/index.ts +++ b/examples/vue2/test-components/index.ts @@ -1,4 +1,4 @@ -import Vue, { CreateElement } from 'vue2' +import Vue from 'vue2' import VueTypes from 'vue-types' import { boolType, diff --git a/examples/vue2/test-components/single.ts b/examples/vue2/test-components/single.ts index c2c88258..0bdbb167 100644 --- a/examples/vue2/test-components/single.ts +++ b/examples/vue2/test-components/single.ts @@ -35,3 +35,7 @@ const UserProfile = Vue.extend({ new Vue({ render: (h) => h(UserComponent), }) + +new Vue({ + render: (h) => h(UserProfile), +}) diff --git a/examples/vue3/test-components/single.ts b/examples/vue3/test-components/single.ts index 2205d924..8fd07ef7 100644 --- a/examples/vue3/test-components/single.ts +++ b/examples/vue3/test-components/single.ts @@ -36,3 +36,6 @@ const UserProfile = defineComponent({ createApp({ render: () => h(UserComponent), }) +createApp({ + render: () => h(UserProfile), +}) diff --git a/package.json b/package.json index 5ce2277a..4c967e2e 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,10 @@ "build:shim:cjs": "microbundle --external=vue --tsconfig=./tsconfig.build.json -i src/shim.cjs.ts -o dist/shim.cjs --no-pkg-main --format=cjs", "build:umd": "cross-env NODE_ENV=production microbundle --external=vue --tsconfig=./tsconfig.build.json --format=umd", "test": "jest", - "lint": "eslint '{src,__tests__,.}/**/*.{ts,js,cjs}'", + "lint": "run-s lint:*", "lint:examples": "tsc --noEmit -p ./examples", - "examples": "cross-env NODE_ENV=development node ./scripts/run-examples.cjs", + "lint:src": "eslint '{examples,src,__tests__,.}/**/*.{ts,js,cjs}'", + "examples": "vite examples -c examples/vite.config.js", "docs:dev": "vuepress dev docs", "docs:build": "cross-env NODE_ENV=production vuepress build docs" }, From 6454bb069508cd5e399fc46a4a29ef06f113b29a Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 16:23:32 +0900 Subject: [PATCH 05/33] update docs --- docs/guide/validators.md | 61 +++++++++++++++++++++++++++++------ examples/shared/validators.ts | 2 +- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/docs/guide/validators.md b/docs/guide/validators.md index e4582dc7..8c82f786 100644 --- a/docs/guide/validators.md +++ b/docs/guide/validators.md @@ -88,12 +88,8 @@ props: { } ``` -::: tip -[Vue prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) requires Array props to provide default value as a factory function. `array().def()` accepts both factory functions and arrays. In the latter case, VueTypes will convert the value to a factory function for you. -::: - ::: ts -You can specify the type of array items as type argument: +In TypeScript, you can specify the type of array items as type argument: ```ts props: { @@ -109,6 +105,10 @@ runtime validation use [`arrayOf`](#arrayof) ::: +::: tip +[Vue prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) requires Array props to provide default value as a factory function. `array().def()` accepts both factory functions and arrays. In the latter case, VueTypes will convert the value to a factory function for you. +::: + ### bool Validates boolean props. @@ -151,6 +151,21 @@ props: { } ``` +::: ts +You can constrain the number value with a type argument: + +```ts +props: { + // union type + length: number<1 | 2 | 3>() +} +``` + +**Note**: this signature will validate the prop at compile-time only. For +runtime validation use [`oneOf`](#oneof). + +::: + ### integer Validates that a prop is an integer. @@ -161,6 +176,11 @@ props: { } ``` +::: ts +Because `integer()` inherits from `number()`, you can constrain its value with a type argument as well (see above for details). + +::: + ### object Validates that a prop is an object. @@ -171,10 +191,6 @@ props: { } ``` -::: tip -[Vue prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) requires Object props to provide default value as a factory function. `object().def()` accepts both factory functions and plain objects. In the latter case, VueTypes will convert the value to a factory function for you. -::: - ::: ts You can specify the shape of the object as type argument: @@ -197,6 +213,10 @@ runtime validation use [`shape`](#shape) ::: +::: tip +[Vue prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) requires Object props to provide default value as a factory function. `object().def()` accepts both factory functions and plain objects. In the latter case, VueTypes will convert the value to a factory function for you. +::: + ### string Validates that a prop is a string. @@ -207,6 +227,29 @@ props: { } ``` +::: ts +You can constrain the string value with a type argument: + +```ts + +enum Fruits { + Apple = 'Apple', + Pear = 'Pear', +} + +props: { + // string enum + users: string(), + // union type + fruits: string<'apple' | 'pear'>() +} +``` + +**Note**: this signature will validate the prop at compile-time only. For +runtime validation use [`oneOf`](#oneof). + +::: + ### symbol Validates that a prop is a Symbol. diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index 83c5e0e1..4f16abfc 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -44,10 +44,10 @@ enum IntsWords { Two = 'Two', } export const stringType = string().isRequired +export const messageType = string().isRequired export const stringUnionType = string<'one' | 'two'>().def('one') export const stringEnumType = string().def(IntsWords.One) export const stringEnumTypeTS41 = string<`${IntsWords}`>().def(IntsWords.One) -export const messageType = string().isRequired /** * `number` validator examples From 23c778b99d9e6f9c0757aced3e728df4f2b12364 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sat, 10 Jul 2021 17:34:33 +0900 Subject: [PATCH 06/33] verdion bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c967e2e..12a44dde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.0.1", + "version": "4.1.0-beta.1", "description": "Prop types utility for Vue", "author": "Marco Solazzi", "license": "MIT", From 6bb71e1d4076780465ab0986632f7df83a1e5b3f Mon Sep 17 00:00:00 2001 From: Victor Garcia Date: Mon, 12 Jul 2021 21:01:12 +0200 Subject: [PATCH 07/33] Added casting support for oneOfType --- src/validators/oneoftype.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 9ed666a7..77da019b 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -11,8 +11,9 @@ import { } from '../utils' export default function oneOfType< - U extends VueProp | Prop, - V = InferType, + D extends InferType, + U extends VueProp | Prop = any, + V = InferType extends unknown ? U : InferType, >(arr: U[]) { if (!isArray(arr)) { throw new TypeError( @@ -52,13 +53,13 @@ export default function oneOfType< if (!hasCustomValidators) { // we got just native objects (ie: Array, Object) // delegate to Vue native prop check - return toType('oneOfType', { - type: nativeChecks, + return toType('oneOfType', { + type: nativeChecks as unknown as PropType, }) } - return toType('oneOfType', { - type: nativeChecks, + return toType('oneOfType', { + type: nativeChecks as unknown as PropType, validator(value) { const err: string[] = [] const valid = arr.some((type) => { From 5b9c09e88f394bb5ae9881bb1e92c32d1980bb75 Mon Sep 17 00:00:00 2001 From: Victor Garcia Date: Mon, 12 Jul 2021 21:03:53 +0200 Subject: [PATCH 08/33] Fixed some generics --- src/validators/oneoftype.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 77da019b..237eb692 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -10,8 +10,12 @@ import { indent, } from '../utils' +type RawLocation = string | { name: string } +const ctor = oneOfType([String, Object]) // Valid +const route = oneOfType([String, Object]) // Valid + export default function oneOfType< - D extends InferType, + D extends V, U extends VueProp | Prop = any, V = InferType extends unknown ? U : InferType, >(arr: U[]) { From 0e1825c3823f151bcc76aa1519caa090f124ee26 Mon Sep 17 00:00:00 2001 From: Victor Garcia Date: Mon, 12 Jul 2021 21:04:21 +0200 Subject: [PATCH 09/33] Removed tests --- src/validators/oneoftype.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 237eb692..e0911989 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -10,10 +10,6 @@ import { indent, } from '../utils' -type RawLocation = string | { name: string } -const ctor = oneOfType([String, Object]) // Valid -const route = oneOfType([String, Object]) // Valid - export default function oneOfType< D extends V, U extends VueProp | Prop = any, From 9f52e080ddfbccf4fd92254c3105eae27473b94a Mon Sep 17 00:00:00 2001 From: Victor Garcia Date: Tue, 13 Jul 2021 09:57:00 +0200 Subject: [PATCH 10/33] Fixed def typing on oneOfType --- src/validators/oneoftype.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index e0911989..635e09fe 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -10,10 +10,14 @@ import { indent, } from '../utils' +type RawLocation = string | { name: string } +const ctor = oneOfType([String, Object]).def('hello') // Valid +const route = oneOfType([String, Object]).def('hello') // Valid + export default function oneOfType< D extends V, U extends VueProp | Prop = any, - V = InferType extends unknown ? U : InferType, + V = InferType, >(arr: U[]) { if (!isArray(arr)) { throw new TypeError( From 2e3cef8d514a625a47dda76cc6f95fbb12a60fe3 Mon Sep 17 00:00:00 2001 From: Victor Garcia Date: Tue, 13 Jul 2021 09:57:13 +0200 Subject: [PATCH 11/33] Removed tests --- src/validators/oneoftype.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 635e09fe..06bbe926 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -10,10 +10,6 @@ import { indent, } from '../utils' -type RawLocation = string | { name: string } -const ctor = oneOfType([String, Object]).def('hello') // Valid -const route = oneOfType([String, Object]).def('hello') // Valid - export default function oneOfType< D extends V, U extends VueProp | Prop = any, From 28f8d9ed4e46326eb474456d84f280d9e242ee87 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Tue, 13 Jul 2021 18:24:35 +0900 Subject: [PATCH 12/33] oneOfType examples with casting --- examples/shared/validators.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index 4f16abfc..ce7b8331 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -97,6 +97,21 @@ export const stringOrNumberOrBoolType = oneOfType([ bool(), ]) +export const stringOrObject = oneOfType([String, Object]) +export const stringOrObjectCast = oneOfType([ + String, + Object, +]) +export const stringOrCastedObject = oneOfType([ + String, + object<{ name: string }>(), +]) +type stringTuple = 'one' | 'two' +export const castedStringOrCastedObject = oneOfType([ + string(), + object<{ name: string }>(), +]).def('one') + /** * `arrayOf` validator examples */ From f99d9a299d8f6a692f2917a382ef0a820945e1c1 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Tue, 13 Jul 2021 19:07:46 +0900 Subject: [PATCH 13/33] add ts arguments examples and docs --- docs/guide/validators.md | 37 ++++++++++++++++++++++++++++++++++- examples/shared/validators.ts | 18 ++++++++++------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/docs/guide/validators.md b/docs/guide/validators.md index 8c82f786..559ef3c5 100644 --- a/docs/guide/validators.md +++ b/docs/guide/validators.md @@ -317,7 +317,7 @@ props: { ### oneOfType -Validates that a prop is an object that could be one of many types. Accepts JavaScript constructors, Vue.js props validation objects and VueTypes validators objects. +Validates that a prop is an object that could be one of many types. Accepts as inner validators an array of JavaScript constructors, Vue.js props validation objects and VueTypes validators objects. ```js props: { @@ -326,6 +326,29 @@ props: { } ``` +::: ts +You can constrain the expected types passing them as type argument: + +```ts +type User = { name: string; id: string } + +props: { + // string or instance of User + theProp: oneOfType([String, Object]) +} +``` + +Constraints can be set on the inner validators as well: + +```ts +type User = { name: string; id: string } + +props: { + // same as above + theProp: oneOfType([String, object()]) +} +``` + ### arrayOf Validates that a prop is an array of a certain type. Accepts JavaScript constructors, Vue.js props validation objects and VueTypes validators objects. @@ -346,10 +369,22 @@ Prop Validators are composable. For example, to validate an array that can conta ```js props: { + // an array containing both strings and numbers collection: arrayOf(oneOfType([String, Number])) } ``` +In TypeScript, composition can be used together with type arguments to constrain the final prop type: + +```ts +type User = { name: string; id: string } + +props: { + // an array containing both arrays of strings and User object instances + collection: arrayOf(oneOfType([array(), object()])) +} +``` + ::: ### objectOf diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index ce7b8331..9ef6daa2 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -91,6 +91,8 @@ export const oneOfTuple = oneOf([1, 2, 'string'] as const).def(1) /** * `oneOfType` validator examples */ +type stringTuple = 'one' | 'two' +type UserOneOf = { name: string } export const stringOrNumberOrBoolType = oneOfType([ { type: String }, Number, @@ -98,18 +100,15 @@ export const stringOrNumberOrBoolType = oneOfType([ ]) export const stringOrObject = oneOfType([String, Object]) -export const stringOrObjectCast = oneOfType([ +export const stringOrObjectCast = oneOfType([ String, Object, ]) -export const stringOrCastedObject = oneOfType([ - String, - object<{ name: string }>(), -]) -type stringTuple = 'one' | 'two' +export const stringOrCastedObject = oneOfType([String, object()]) + export const castedStringOrCastedObject = oneOfType([ string(), - object<{ name: string }>(), + object(), ]).def('one') /** @@ -121,6 +120,11 @@ export const arrayofUsersType = arrayOf(userType) export const arrayOfStringsType2 = arrayOf(String) export const arrayOfMultipleType = arrayOf(stringOrNumberOrBoolType).def(['a']) export const arrayOfVueProp = arrayOf({ type: [String, Number] }) +type UserArrayOf = { name: string } + +export const arrayOfCastedTypes = arrayOf( + oneOfType([object(), array()]), +) /** * `instanceOf` validator examples From 670605c2833451929bc30ad4904e5a2f39e3b1b5 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 14 Jul 2021 11:00:05 +0900 Subject: [PATCH 14/33] fix linting --- __tests__/utils.test.ts | 5 ++--- examples/shared/default-namespace.ts | 8 ++++---- src/utils.ts | 4 ++-- src/validators/native.ts | 6 +++--- src/validators/oneoftype.ts | 6 +++--- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index 1aa9c097..0250fcb4 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -244,9 +244,8 @@ describe('`toType()`', () => { describe('`toValidableType()`', () => { it('creates a type', () => { const obj = { a: 'hello' } - const type = utils - .toValidableType('testType', { type: Object }) - .def(obj).isRequired + const type = utils.toValidableType('testType', { type: Object }).def(obj) + .isRequired expect(type.default()).toEqual(obj) expect(type.required).toBe(true) expect(type._vueTypes_name).toBe('testType') diff --git a/examples/shared/default-namespace.ts b/examples/shared/default-namespace.ts index 4cdd8670..7dbd8b62 100644 --- a/examples/shared/default-namespace.ts +++ b/examples/shared/default-namespace.ts @@ -37,8 +37,8 @@ export const symbolType = VueTypes.symbol.def(Symbol('foo')).isRequired const validator = (v: number) => v > 18 export const customType = VueTypes.custom(validator).def(0).isRequired -export const customTypeStrict = - VueTypes.custom(validator).def(0).isRequired +export const customTypeStrict = VueTypes.custom(validator).def(0) + .isRequired export const oneOf = VueTypes.oneOf([0, 'string', null]).def(2).isRequired @@ -52,8 +52,8 @@ class MyClass { const instance = new MyClass() -export const instanceOfType = - VueTypes.instanceOf(MyClass).def(instance).isRequired +export const instanceOfType = VueTypes.instanceOf(MyClass).def(instance) + .isRequired instanceOfType.type = MyClass export const oneOfTypeType = VueTypes.oneOfType([ diff --git a/src/utils.ts b/src/utils.ts index 70432438..86018546 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -353,11 +353,11 @@ export function clone(obj: T): T { export function fromType>(name: string, source: T): T export function fromType< T extends VueTypeDef, - V extends PropOptions>, + V extends PropOptions> >(name: string, source: T, props: V): Omit & V export function fromType< T extends VueTypeDef, - V extends PropOptions>, + V extends PropOptions> >(name: string, source: T, props?: V) { // 1. create an exact copy of the source type const copy = clone(source) diff --git a/src/validators/native.ts b/src/validators/native.ts index 2d0803af..527aa77e 100644 --- a/src/validators/native.ts +++ b/src/validators/native.ts @@ -15,12 +15,12 @@ export const bool = () => export const string = () => toValidableType('string', { - type: String as unknown as PropType, + type: (String as unknown) as PropType, }) export const number = () => toValidableType('number', { - type: Number as unknown as PropType, + type: (Number as unknown) as PropType, }) export const array = () => @@ -35,7 +35,7 @@ export const object = () => export const integer = () => toType('integer', { - type: Number as unknown as PropType, + type: (Number as unknown) as PropType, validator(value) { return isInteger(value) }, diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 06bbe926..c70d2c9d 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -13,7 +13,7 @@ import { export default function oneOfType< D extends V, U extends VueProp | Prop = any, - V = InferType, + V = InferType >(arr: U[]) { if (!isArray(arr)) { throw new TypeError( @@ -54,12 +54,12 @@ export default function oneOfType< // we got just native objects (ie: Array, Object) // delegate to Vue native prop check return toType('oneOfType', { - type: nativeChecks as unknown as PropType, + type: (nativeChecks as unknown) as PropType, }) } return toType('oneOfType', { - type: nativeChecks as unknown as PropType, + type: (nativeChecks as unknown) as PropType, validator(value) { const err: string[] = [] const valid = arr.some((type) => { From 3a9e41f856a6d84c5ad740968ea938efc9447775 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 14 Jul 2021 11:31:06 +0900 Subject: [PATCH 15/33] fix linting (again) --- __tests__/utils.test.ts | 5 +++-- examples/shared/default-namespace.ts | 8 ++++---- src/utils.ts | 4 ++-- src/validators/native.ts | 6 +++--- src/validators/oneoftype.ts | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index 0250fcb4..1aa9c097 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -244,8 +244,9 @@ describe('`toType()`', () => { describe('`toValidableType()`', () => { it('creates a type', () => { const obj = { a: 'hello' } - const type = utils.toValidableType('testType', { type: Object }).def(obj) - .isRequired + const type = utils + .toValidableType('testType', { type: Object }) + .def(obj).isRequired expect(type.default()).toEqual(obj) expect(type.required).toBe(true) expect(type._vueTypes_name).toBe('testType') diff --git a/examples/shared/default-namespace.ts b/examples/shared/default-namespace.ts index 7dbd8b62..4cdd8670 100644 --- a/examples/shared/default-namespace.ts +++ b/examples/shared/default-namespace.ts @@ -37,8 +37,8 @@ export const symbolType = VueTypes.symbol.def(Symbol('foo')).isRequired const validator = (v: number) => v > 18 export const customType = VueTypes.custom(validator).def(0).isRequired -export const customTypeStrict = VueTypes.custom(validator).def(0) - .isRequired +export const customTypeStrict = + VueTypes.custom(validator).def(0).isRequired export const oneOf = VueTypes.oneOf([0, 'string', null]).def(2).isRequired @@ -52,8 +52,8 @@ class MyClass { const instance = new MyClass() -export const instanceOfType = VueTypes.instanceOf(MyClass).def(instance) - .isRequired +export const instanceOfType = + VueTypes.instanceOf(MyClass).def(instance).isRequired instanceOfType.type = MyClass export const oneOfTypeType = VueTypes.oneOfType([ diff --git a/src/utils.ts b/src/utils.ts index 86018546..70432438 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -353,11 +353,11 @@ export function clone(obj: T): T { export function fromType>(name: string, source: T): T export function fromType< T extends VueTypeDef, - V extends PropOptions> + V extends PropOptions>, >(name: string, source: T, props: V): Omit & V export function fromType< T extends VueTypeDef, - V extends PropOptions> + V extends PropOptions>, >(name: string, source: T, props?: V) { // 1. create an exact copy of the source type const copy = clone(source) diff --git a/src/validators/native.ts b/src/validators/native.ts index 527aa77e..2d0803af 100644 --- a/src/validators/native.ts +++ b/src/validators/native.ts @@ -15,12 +15,12 @@ export const bool = () => export const string = () => toValidableType('string', { - type: (String as unknown) as PropType, + type: String as unknown as PropType, }) export const number = () => toValidableType('number', { - type: (Number as unknown) as PropType, + type: Number as unknown as PropType, }) export const array = () => @@ -35,7 +35,7 @@ export const object = () => export const integer = () => toType('integer', { - type: (Number as unknown) as PropType, + type: Number as unknown as PropType, validator(value) { return isInteger(value) }, diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index c70d2c9d..06bbe926 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -13,7 +13,7 @@ import { export default function oneOfType< D extends V, U extends VueProp | Prop = any, - V = InferType + V = InferType, >(arr: U[]) { if (!isArray(arr)) { throw new TypeError( @@ -54,12 +54,12 @@ export default function oneOfType< // we got just native objects (ie: Array, Object) // delegate to Vue native prop check return toType('oneOfType', { - type: (nativeChecks as unknown) as PropType, + type: nativeChecks as unknown as PropType, }) } return toType('oneOfType', { - type: (nativeChecks as unknown) as PropType, + type: nativeChecks as unknown as PropType, validator(value) { const err: string[] = [] const valid = arr.some((type) => { From 68110795861a9cfd9cede3a9005d910c10b4373f Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 14 Jul 2021 11:56:03 +0900 Subject: [PATCH 16/33] oneOfType: better management of null and true types --- __tests__/validators/oneoftype.test.ts | 7 ++++++- src/validators/oneoftype.ts | 13 ++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/__tests__/validators/oneoftype.test.ts b/__tests__/validators/oneoftype.test.ts index 11e80a8f..6a0f1bd9 100644 --- a/__tests__/validators/oneoftype.test.ts +++ b/__tests__/validators/oneoftype.test.ts @@ -1,4 +1,4 @@ -import { string, integer } from '../../src/validators/native' +import { string, integer, any } from '../../src/validators/native' import oneOf from '../../src/validators/oneof' import shape from '../../src/validators/shape' import oneOfType from '../../src/validators/oneoftype' @@ -65,4 +65,9 @@ describe('`.oneOfType`', () => { expect(validator({ id: 2 })).toBe(false) }) + + it('should validate edge cases with null and true', () => { + expect(oneOfType([any()]).type).toBe(null) + expect(oneOfType([{ type: true }]).type).toBe(null) + }) }) diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 06bbe926..c1f3b2c0 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -23,7 +23,7 @@ export default function oneOfType< let hasCustomValidators = false - let nativeChecks: Prop[] = [] + let nativeChecks: Prop[] | null = [] for (let i = 0; i < arr.length; i += 1) { const type = arr[i] @@ -39,10 +39,13 @@ export default function oneOfType< if (isFunction(type.validator)) { hasCustomValidators = true } - if (type.type !== true && type.type) { - nativeChecks = nativeChecks.concat(type.type) + if (type.type === true || !type.type) { + warn('oneOfType - invalid usage of "true" or "null" as types.') continue } + if (type.type) { + nativeChecks = nativeChecks.concat(type.type) + } } nativeChecks.push(type as Prop) } @@ -50,6 +53,10 @@ export default function oneOfType< // filter duplicates nativeChecks = nativeChecks.filter((t, i) => nativeChecks.indexOf(t) === i) + if (nativeChecks.length === 0) { + nativeChecks = null + } + if (!hasCustomValidators) { // we got just native objects (ie: Array, Object) // delegate to Vue native prop check From b81cf322a265a33c67bc6cd5d9c049f6be1774b1 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 14 Jul 2021 11:56:22 +0900 Subject: [PATCH 17/33] any: add type argument --- examples/shared/validators.ts | 1 + src/validators/native.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index 9ef6daa2..c51d194d 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -21,6 +21,7 @@ import { * `any` validator examples */ export const anyType = any() +export const anyTypeCast = any() /** * `func` validator examples diff --git a/src/validators/native.ts b/src/validators/native.ts index 2d0803af..4a14bc3b 100644 --- a/src/validators/native.ts +++ b/src/validators/native.ts @@ -1,7 +1,7 @@ import { toType, toValidableType, isInteger } from '../utils' import { PropType } from '../types' -export const any = () => toValidableType('any', {}) +export const any = () => toValidableType('any', {}) export const func = any>() => toValidableType('function', { From d7ca126612eec694d52ad74030e42c49d5cda080 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 14 Jul 2021 17:10:51 +0900 Subject: [PATCH 18/33] add some ts documentation --- docs/.vuepress/config.js | 1 + docs/advanced/typescript.md | 146 ++++++++++++++++++++++++++++++++++++ docs/guide/validators.md | 37 ++++++++- 3 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 docs/advanced/typescript.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 2bd70776..1a1ab7e0 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -40,6 +40,7 @@ module.exports = { children: [ '/advanced/extending-vue-types', '/advanced/custom-instance', + '/advanced/typescript', ], }, ], diff --git a/docs/advanced/typescript.md b/docs/advanced/typescript.md new file mode 100644 index 00000000..eca297cf --- /dev/null +++ b/docs/advanced/typescript.md @@ -0,0 +1,146 @@ +# TypeScript Usage + +VueTypes is written in TypeScript and comes with builtin types support for its API and validators. + +Most of the validators can infer the prop type from their configuration: + +```ts +props: { + // prop type is `string` + name: string(), + // ERROR: Argument of type 'boolean' is not assignable to parameter of type 'string' + surname: string().def(false), +} +``` + +## Optional type constraint + +Some validators accepts an optional type argument to refine their prop type. + +### any + +```ts +props: { + unknownProp: any() +} +``` + +### string + +Accepts both strings and enums. + +```ts +props: { + // use a union type to constrain the string type + color: string<'red' | 'green'>() +} + +enum Colors { + red = 'red' + green = 'green' +} + +props: { + // same as above, but with an enum + color: string() +} +``` + +::: tip +The same prop type can be expressed using `oneOf` which will also perform a validation at runtime: + +```ts +props: { + genre: oneOf(['red', 'green'] as const) +} +``` + +::: + +### number and integer + +```ts +props: { + // use a union type to constrain the number type + count: number<1 | 2>() + + countInt: integer<1 | 2>() +} +``` + +### func any> + +Useful to cast even handlers and function return types. + +```ts +type EventFn = (e: Event) => void +type AsyncFn = () => Promise + +props: { + onClick: fn() + loadStrings: fn() +} +``` + +### object + +```ts +interface User { + name: string + // ... +} + +props: { + user: object() +} +``` + +::: tip +To have both compile-time and runtime validation, you can use `shape`: + +```ts +interface User { + name: string + // ... +} + +props: { + user: shape({ + name: string().isRequired, + }) +} +``` + +::: + +### array + +```ts +interface User { + name: string + // ... +} + +props: { + sizes: array() + users: array() +} +``` + +::: tip +The same prop types can be expressed using `arrayOf` which will also perform a validation at runtime: + +```ts +interface User { + name: string + // ... +} + +props: { + sizes: arrayOf(Number) + // cast the object() validator to User + users: arrayOf(object()) +} +``` + +::: diff --git a/docs/guide/validators.md b/docs/guide/validators.md index 559ef3c5..0f78a5e4 100644 --- a/docs/guide/validators.md +++ b/docs/guide/validators.md @@ -70,7 +70,7 @@ type.def(undefined) ### any -Validates any type of value. +Validates any type of value. This validator should be used sparingly and can be an escape hatch for props with unknown values. ```js props: { @@ -78,6 +78,20 @@ props: { } ``` +::: ts +In TypeScript, you can specify a type constraint other than `any`: + +```ts +props: { + // type is `any` + myPropAny: any(), + // type is `unknown` + myPropUnknown: any(), +} +``` + +::: + ### array Validates that a prop is an array primitive. @@ -428,8 +442,8 @@ You can constrain the shape with a type argument: ```ts interface User { - name: string - age: number + name?: string + age?: number id: number } @@ -504,6 +518,23 @@ props: { } ``` +::: ts +In TypeScript, you can specify the prop type with a type argument: + +```ts +function minLength(value) { + return typeof value === 'string' && value.length >= 6 +} + +// ... +props: { + // theProp is a string + theProp: custom(minLength) +} +``` + +::: + ## Utilities VueTypes exposes some useful utility functions that can be used to extend the library functionalities. From 52729805156e82aa272307424f2fb12c539cc38b Mon Sep 17 00:00:00 2001 From: dwightjack Date: Sun, 18 Jul 2021 10:51:49 +0900 Subject: [PATCH 19/33] docs and shim fix --- docs/advanced/typescript.md | 103 ++++++++++++++++++++++++++++++++-- examples/shared/validators.ts | 12 +++- 2 files changed, 109 insertions(+), 6 deletions(-) diff --git a/docs/advanced/typescript.md b/docs/advanced/typescript.md index eca297cf..221bac8e 100644 --- a/docs/advanced/typescript.md +++ b/docs/advanced/typescript.md @@ -1,6 +1,6 @@ # TypeScript Usage -VueTypes is written in TypeScript and comes with builtin types support for its API and validators. +VueTypes is written in TypeScript and comes with full builtin types support. Most of the validators can infer the prop type from their configuration: @@ -15,7 +15,7 @@ props: { ## Optional type constraint -Some validators accepts an optional type argument to refine their prop type. +Some validators accepts an optional type argument to refine their TS typing. ### any @@ -70,7 +70,7 @@ props: { ### func any> -Useful to cast even handlers and function return types. +Useful to type event handlers and function return types. ```ts type EventFn = (e: Event) => void @@ -113,7 +113,9 @@ props: { ::: -### array +### array + +The validator accepts an argument defining the contained items type. ```ts interface User { @@ -122,7 +124,9 @@ interface User { } props: { + // array of numbers sizes: array() + // array of users users: array() } ``` @@ -138,9 +142,98 @@ interface User { props: { sizes: arrayOf(Number) - // cast the object() validator to User + // set the object() validator type to User users: arrayOf(object()) } ``` ::: + +### OneOfType\ + +You can use a union type to specify the expected types. + +```ts +interface User { + name: string + // ... +} + +props: { + // string or instance of User + theProp: oneOfType([String, Object]) +} +``` + +::: tip +The same prop types can be expressed composing VueTypes validators: + +```ts +interface User { + name: string + // ... +} + +props: { + // same as above + theProp: oneOfType([String, object()]) +} +``` + +::: + +### shape\ + +Setting the type argument provides type checking on top of runtime validation: + +```ts +interface User { + name: string + id?: string +} + +props: { + user: shape({ + name: string().isRequired, + id: string(), + }) +} +``` + +### oneOf + +This validator does not support type arguments, but you can use [const assertions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) on the expected values to constrain the validators type: + +```ts +props: { + // ERROR: Argument of type '"small"' is not assignable + // to parameter of type '"large" | "medium"'. + sizes: oneOf(['large', 'medium'] as const).def('small') +} +``` + +### custom\ + +You can define the type of the value received by the validator function. + +```ts +props: { + // function argument is of type string + nonEmptyString: custom((v) => typeof v === 'string' && v.length > 0) +} +``` + +::: tip +This validator can be used for tuple props: + +```ts +type Pair = [string, number] + +props: { + tuple: custom( + ([a, b]) => typeof a === 'string' && typeof b === 'number', + ) +} +``` + +::: diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index c51d194d..da25c024 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -15,7 +15,7 @@ import { shape, toType, fromType, -} from 'vue-types' +} from 'vue-types/shim' /** * `any` validator examples @@ -88,6 +88,16 @@ export const tupleType = custom( * `oneOf` validator examples */ export const oneOfTuple = oneOf([1, 2, 'string'] as const).def(1) +interface OneUser { + name: string +} +const oneObj: OneUser = { + name: 'John', +} + +export const oneOfInstances = oneOf(['hello', oneObj] as const) + +oneOf(['large', 'medium'] as const) /** * `oneOfType` validator examples From 5ed92ff3639ed1cfa7f70694aa5f45b16cef6915 Mon Sep 17 00:00:00 2001 From: Marco Solazzi Date: Sun, 18 Jul 2021 12:24:25 +0900 Subject: [PATCH 20/33] vue template demo --- examples/shared/validators.ts | 2 +- examples/vue3/test-components/template.vue | 39 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 examples/vue3/test-components/template.vue diff --git a/examples/shared/validators.ts b/examples/shared/validators.ts index da25c024..085f4549 100644 --- a/examples/shared/validators.ts +++ b/examples/shared/validators.ts @@ -15,7 +15,7 @@ import { shape, toType, fromType, -} from 'vue-types/shim' +} from 'vue-types' /** * `any` validator examples diff --git a/examples/vue3/test-components/template.vue b/examples/vue3/test-components/template.vue new file mode 100644 index 00000000..3f37af5c --- /dev/null +++ b/examples/vue3/test-components/template.vue @@ -0,0 +1,39 @@ + + From 6441581ef890f12d7065209843f2cd0534d5e3c2 Mon Sep 17 00:00:00 2001 From: Marco Solazzi Date: Sun, 18 Jul 2021 12:35:50 +0900 Subject: [PATCH 21/33] docs review --- docs/advanced/typescript.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/advanced/typescript.md b/docs/advanced/typescript.md index 221bac8e..6bfc5caa 100644 --- a/docs/advanced/typescript.md +++ b/docs/advanced/typescript.md @@ -200,18 +200,6 @@ props: { } ``` -### oneOf - -This validator does not support type arguments, but you can use [const assertions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) on the expected values to constrain the validators type: - -```ts -props: { - // ERROR: Argument of type '"small"' is not assignable - // to parameter of type '"large" | "medium"'. - sizes: oneOf(['large', 'medium'] as const).def('small') -} -``` - ### custom\ You can define the type of the value received by the validator function. @@ -237,3 +225,15 @@ props: { ``` ::: + +### oneOf + +This validator does not support type arguments, but you can use [const assertions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) on the expected values to constrain the validators type: + +```ts +props: { + // ERROR: Argument of type '"small"' is not assignable + // to parameter of type '"large" | "medium"'. + sizes: oneOf(['large', 'medium'] as const).def('small') +} +``` From 48ea4ff452b38449f09eee9a7cbde952c043f4d0 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Tue, 20 Jul 2021 09:19:22 +0900 Subject: [PATCH 22/33] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 12a44dde..f4137ffd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.1.0-beta.1", + "version": "4.1.0-beta.2", "description": "Prop types utility for Vue", "author": "Marco Solazzi", "license": "MIT", From 499927b9a3ce1613030d8a86538f0e02042f0b31 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Wed, 28 Jul 2021 15:19:49 +0900 Subject: [PATCH 23/33] strict checks --- examples/shared/default-namespace.ts | 2 +- examples/tsconfig.json | 1 + package.json | 2 +- src/validators/oneoftype.ts | 10 ++++------ 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/examples/shared/default-namespace.ts b/examples/shared/default-namespace.ts index 4cdd8670..da05a2ac 100644 --- a/examples/shared/default-namespace.ts +++ b/examples/shared/default-namespace.ts @@ -14,7 +14,7 @@ export const arrayType2 = VueTypes.array.def(() => []).isRequired export const stringType = VueTypes.string.def('John').isRequired export const stringTypeValidate = VueTypes.string .def('John') - .isRequired.validate((v: string): boolean => v === 'John') + .isRequired.validate((v: unknown): boolean => v === 'John') export const numberType = VueTypes.number.def(0).isRequired export const integerType = VueTypes.integer.def(0).isRequired diff --git a/examples/tsconfig.json b/examples/tsconfig.json index 5ea3e254..21baa029 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -6,6 +6,7 @@ "resolveJsonModule": true, "esModuleInterop": true, "moduleResolution": "node", + "strict": true, "noEmit": true, "jsx": "react", "jsxFactory": "h", diff --git a/package.json b/package.json index f4137ffd..e4831b36 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "build:umd": "cross-env NODE_ENV=production microbundle --external=vue --tsconfig=./tsconfig.build.json --format=umd", "test": "jest", "lint": "run-s lint:*", - "lint:examples": "tsc --noEmit -p ./examples", + "lint:ts": "tsc --noEmit -p ./examples", "lint:src": "eslint '{examples,src,__tests__,.}/**/*.{ts,js,cjs}'", "examples": "vite examples -c examples/vite.config.js", "docs:dev": "vuepress dev docs", diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index c1f3b2c0..798315e3 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -23,7 +23,7 @@ export default function oneOfType< let hasCustomValidators = false - let nativeChecks: Prop[] | null = [] + let nativeChecks: Prop[] = [] for (let i = 0; i < arr.length; i += 1) { const type = arr[i] @@ -53,20 +53,18 @@ export default function oneOfType< // filter duplicates nativeChecks = nativeChecks.filter((t, i) => nativeChecks.indexOf(t) === i) - if (nativeChecks.length === 0) { - nativeChecks = null - } + const typeProp = nativeChecks.length > 0 ? nativeChecks : null if (!hasCustomValidators) { // we got just native objects (ie: Array, Object) // delegate to Vue native prop check return toType('oneOfType', { - type: nativeChecks as unknown as PropType, + type: typeProp as unknown as PropType, }) } return toType('oneOfType', { - type: nativeChecks as unknown as PropType, + type: typeProp as unknown as PropType, validator(value) { const err: string[] = [] const valid = arr.some((type) => { From 701f9fc74e71b741276443e8948f4279e2431a16 Mon Sep 17 00:00:00 2001 From: ksenkso Date: Mon, 2 Aug 2021 19:58:55 +0300 Subject: [PATCH 24/33] add `logLevel` config option --- src/config.ts | 5 ++++- src/types.d.ts | 5 +++++ src/utils.ts | 7 ++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/config.ts b/src/config.ts index 122afbc3..ca3fb2f4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,3 +1,6 @@ -export const config = { +import { VueTypesConfig } from './types' + +export const config: VueTypesConfig = { silent: false, + logLevel: 'warn', } diff --git a/src/types.d.ts b/src/types.d.ts index 00ceacac..1a4184e4 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -115,3 +115,8 @@ export interface ExtendProps { default?: T | null | undefined | (() => T | null | undefined) validator?(...args: any[]): boolean } + +export interface VueTypesConfig { + silent: boolean + logLevel: 'log' | 'warn' | 'error' | 'debug' | 'info' +} diff --git a/src/utils.ts b/src/utils.ts index 70432438..45b06ea7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -53,9 +53,10 @@ let warn: (msg: string) => string | void = identity if (process.env.NODE_ENV !== 'production') { const hasConsole = typeof console !== 'undefined' warn = hasConsole - ? function warn(msg) { - // eslint-disable-next-line no-console - config.silent === false && console.warn(`[VueTypes warn]: ${msg}`) + ? function warn(msg: string, level = config.logLevel) { + if (config.silent === false) { + console[level](`[VueTypes warn]: ${msg}`) + } } : identity } From fdb4cfa078a45faa07bfc211b500db8dd86ebe99 Mon Sep 17 00:00:00 2001 From: ksenkso Date: Mon, 2 Aug 2021 19:59:28 +0300 Subject: [PATCH 25/33] add tests for `logLevel` config option --- __tests__/jest.setup.js | 4 ++++ __tests__/utils.test.ts | 44 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/__tests__/jest.setup.js b/__tests__/jest.setup.js index 1c5a8fa1..28eda846 100644 --- a/__tests__/jest.setup.js +++ b/__tests__/jest.setup.js @@ -1,2 +1,6 @@ /* eslint-env jest */ +console.log = jest.fn() console.warn = jest.fn() +console.error = jest.fn() +console.debug = jest.fn() +console.info = jest.fn() diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index 1aa9c097..87d2ec86 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -1,5 +1,11 @@ import * as utils from '../src/utils' -import { VueTypeDef } from '../src/types' +import { VueTypeDef } from '../src' +import { config } from '../src' + +beforeEach(() => { + config.logLevel = 'warn' + config.silent = false +}) describe('`getType()`', () => { it('return the type constructor as a string', () => { @@ -331,3 +337,39 @@ describe('`fromType()`', () => { expect(validatorCopy.mock.instances[0]).toBe(copy as any) }) }) + +describe('`warn()`', () => { + it('calls `console.warn` by default', () => { + const message = 'message' + utils.warn(message) + expect(console.warn).toHaveBeenCalledWith(`[VueTypes warn]: ${message}`) + }) + + it('calls `console.log` if `config.logLevel` is `log`', () => { + config.logLevel = 'log' + const message = 'message' + utils.warn(message) + expect(console.log).toHaveBeenCalledWith(`[VueTypes warn]: ${message}`) + }) + + it('calls `console.error` if `config.logLevel` is `error`', () => { + config.logLevel = 'error' + const message = 'message' + utils.warn(message) + expect(console.error).toHaveBeenCalledWith(`[VueTypes warn]: ${message}`) + }) + + it('calls `console.debug` if `config.logLevel` is `debug`', () => { + config.logLevel = 'debug' + const message = 'message' + utils.warn(message) + expect(console.debug).toHaveBeenCalledWith(`[VueTypes warn]: ${message}`) + }) + + it('calls `console.info` if `config.logLevel` is `info`', () => { + config.logLevel = 'info' + const message = 'message' + utils.warn(message) + expect(console.info).toHaveBeenCalledWith(`[VueTypes warn]: ${message}`) + }) +}) From 4c3a60b077b8b282d2b367ee3207a4ac2ce2dc9d Mon Sep 17 00:00:00 2001 From: ksenkso Date: Mon, 2 Aug 2021 19:59:44 +0300 Subject: [PATCH 26/33] add docs for `logLevel` config option --- docs/guide/configuration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 4db3f159..621188fc 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -20,8 +20,6 @@ VueTypes.config === config ## Configuration Options -At the moment, there is only one configuration option: - - `silent`: (boolean, default `false`) set to `true` to prevent VueTypes from logging validation warnings. ::: tip @@ -37,3 +35,5 @@ config.silent = Vue.config.silent ``` ::: + +- `logLevel`: (string, default `warn`) allows choosing which console method will be used to display validation errors. Available options are `log`, `warn`, `error`, `debug` and`info`. From 4dd497021038f4f7aafe7a03cdb1334c25bd3710 Mon Sep 17 00:00:00 2001 From: dwightjack Date: Thu, 29 Jul 2021 14:10:56 +0900 Subject: [PATCH 27/33] improved shim dx --- .eslintignore | 1 + .gitignore | 2 ++ docs/guide/installation.md | 38 +++++++++++++++++++++++++------------- package.json | 26 +++++++++++++++----------- shim/package.json | 15 +++++++++++++++ 5 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 shim/package.json diff --git a/.eslintignore b/.eslintignore index de4d1f00..a971e805 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ dist node_modules +shim diff --git a/.gitignore b/.gitignore index 3a7fccb7..b647c1e4 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ Icon .Spotlight-V100 .Trashes dist +shim/*.* +!shim/package.json diff --git a/docs/guide/installation.md b/docs/guide/installation.md index b28734e2..2b5cca92 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -23,41 +23,53 @@ Add the following script tags before your code ## Usage with bundlers -Starting from version 4, VueTypes is published as a native ESM module with CommonJS and UMD support. +Starting from version 4, VueTypes is published as a **native ESM module** with CommonJS and UMD support. Modern bundlers and tools should be able to automatically pick the correct version based on your configuration. -Anyway, here is the list of available entry points: +::: tip NOTE + +Here is the list of available entry points: - `vue-types.modern.js`: ES module for environments [supporting it](https://caniuse.com/es6-module). This is the default entry point for Node 14+, Webpack 5+, Rollup and other tools with native support for ES Modules (like [Vite](https://vitejs.dev/), Vue CLI 5 and [Snowpack](https://www.snowpack.dev/)). - `vue-types.m.js`: ES5 compiled version exported as ES module. This is the default entry point for Webpack 4 and frameworks like [Nuxt 2](https://nuxtjs.org/) and [Vue CLI 4](https://cli.vuejs.org/) - `vue-types.cjs`: ES5 compiled version exported as CommonJS module. This is the default entry point for Node 12 and older and tools not supporting ES Modules. - `vue-types.umd.js`: ES5 compiled version bundled as UMD module. This entry point can be used when loading VueTypes from a ` + ``` **Note:** In order to use a specific version of the library change `@latest` with `@`: ```html - - + + ``` ### Webpack 4 and earlier @@ -73,7 +85,7 @@ return { alias: { // ... other aliases ...(process.env.NODE_ENV === 'production' && { - 'vue-types': require.resolve('vue-types/dist/shim.m.js'), + 'vue-types': 'vue-types/shim', }), }, }, diff --git a/package.json b/package.json index 31b6c8b3..d5995fb4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.1.0-beta.2", + "version": "4.1.0-beta.3", "description": "Prop types utility for Vue", "author": "Marco Solazzi", "license": "MIT", @@ -22,8 +22,8 @@ "import": "./dist/vue-types.modern.js" }, "./shim": { - "require": "./dist/shim.cjs", - "import": "./dist/shim.modern.js" + "require": "./shim/index.cjs.js", + "import": "./shim/index.modern.js" } }, "types": "dist/index.d.ts", @@ -32,18 +32,22 @@ }, "files": [ "dist", + "shim", "src", "types/*.d.ts" ], "scripts": { - "prepublishOnly": "run-s lint lint:examples test build", - "build": "run-s build:clean build:copy build:cjs build:shim:cjs build:ts build:umd", - "build:clean": "del dist", - "build:copy": "cpy src/*.d.ts dist", - "build:ts": "microbundle --external=vue --tsconfig=./tsconfig.build.json --format=modern,es", - "build:cjs": "microbundle --external=vue --tsconfig=./tsconfig.build.json -i src/index.cjs.ts -o dist/vue-types.cjs --no-pkg-main --format=cjs", - "build:shim:cjs": "microbundle --external=vue --tsconfig=./tsconfig.build.json -i src/shim.cjs.ts -o dist/shim.cjs --no-pkg-main --format=cjs", - "build:umd": "cross-env NODE_ENV=production microbundle --external=vue --tsconfig=./tsconfig.build.json --format=umd", + "prepublishOnly": "run-s lint lint:ts test build", + "build": "run-s 'clean:*' copy 'build:**'", + "clean:dist": "del dist", + "clean:shim": "del \"shim/*.*\" \"!shim/package.json\"", + "copy": "cpy src/*.d.ts dist", + "build:ts": "microbundle --tsconfig=./tsconfig.build.json --format=modern,es", + "build:cjs": "microbundle --tsconfig=./tsconfig.build.json -i src/index.cjs.ts -o dist/vue-types.cjs --no-pkg-main --format=cjs", + "build:umd": "cross-env NODE_ENV=production microbundle --tsconfig=./tsconfig.build.json --format=umd", + "build:shim:ts": "microbundle --tsconfig=./tsconfig.build.json -i src/shim.ts -o shim/index.js --format=modern,es --no-sourcemap", + "build:shim:cjs": "microbundle --tsconfig=./tsconfig.build.json -i src/shim.cjs.ts -o shim/index.cjs.js --no-pkg-main --format=cjs --no-sourcemap", + "build:shim:umd": "cross-env NODE_ENV=production microbundle --tsconfig=./tsconfig.build.json -i src/shim.cjs.ts -o shim/index.js --format=umd --no-sourcemap", "test": "jest", "lint": "run-s lint:*", "lint:ts": "tsc --noEmit -p ./examples", diff --git a/shim/package.json b/shim/package.json new file mode 100644 index 00000000..3b9c6e6e --- /dev/null +++ b/shim/package.json @@ -0,0 +1,15 @@ +{ + "name": "vue-types-shim", + "main": "index.cjs.js", + "unpkg": "index.umd.js", + "umd:main": "index.umd.js", + "module": "index.m.js", + "esmodule": "index.modern.js", + "types": "../dist/shim.d.ts", + "peerDependencies": { + "vue": "^2.0.0 || ^3.0.0" + }, + "dependencies": { + "is-plain-object": "5.0.0" + } +} From 7d4e33e36d8812df99e61997321f6f242589023d Mon Sep 17 00:00:00 2001 From: dwightjack Date: Thu, 29 Jul 2021 15:49:04 +0900 Subject: [PATCH 28/33] nuxt module and new shim documentation --- docs/guide/installation.md | 70 +++++- nuxt/module.js | 30 +++ nuxt/package.json | 5 + package-lock.json | 498 ++++++++++++++++++++++++++++++++++++- package.json | 4 +- 5 files changed, 597 insertions(+), 10 deletions(-) create mode 100644 nuxt/module.js create mode 100644 nuxt/package.json diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 2b5cca92..49fe45bf 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -25,11 +25,15 @@ Add the following script tags before your code Starting from version 4, VueTypes is published as a **native ESM module** with CommonJS and UMD support. -Modern bundlers and tools should be able to automatically pick the correct version based on your configuration. +Modern bundlers and tools should be able to automatically pick the correct entry point based on your configuration. -::: tip NOTE +```js +import { string, oneOf } from 'vue-types' // or: import VueTypes from 'vue-types'; +``` -Here is the list of available entry points: +::: details More details + +For reference, here is the list of available entry points: - `vue-types.modern.js`: ES module for environments [supporting it](https://caniuse.com/es6-module). This is the default entry point for Node 14+, Webpack 5+, Rollup and other tools with native support for ES Modules (like [Vite](https://vitejs.dev/), Vue CLI 5 and [Snowpack](https://www.snowpack.dev/)). - `vue-types.m.js`: ES5 compiled version exported as ES module. This is the default entry point for Webpack 4 and frameworks like [Nuxt 2](https://nuxtjs.org/) and [Vue CLI 4](https://cli.vuejs.org/) @@ -40,13 +44,15 @@ Here is the list of available entry points: ## Production build -Vue.js does not validate components' props when used in a production build. If you're using a bundler such as Webpack or rollup you can shrink VueTypes file size by around **70%** (minified and gzipped) by removing the validation logic while preserving the library's API methods. To achieve that result, VueTypes ships with a `vue-types/shim` module that can be used as alias in the production build. +If you're using a bundler such as Webpack or rollup, you can shrink VueTypes file size by around **70%** (minified and gzipped) by removing the validation logic while preserving the library's API methods. To achieve that result, VueTypes ships with a `vue-types/shim` module that can be used as alias in production builds. + +By just aliasing `vue-types` to `vue-types/shim`, bundlers should be able to pick the module type that fits your configuration (ES, CommonJS, ...). -By aliasing `vue-types` to `vue-types/shim`, bundlers should be able to pick the module type that fits your configuration (ES, CommonJS, ...). +See below for common configuration scenarios. -::: tip NOTE +::: details More details -As an additional insight, here is a table showing the full and shim versions of the library for each module system. +For reference, here is a table showing the full and shim versions of the library for each module system. | Module system | Full Library entry point | Shim entry point | | ------------- | ------------------------ | ---------------------- | @@ -132,7 +138,55 @@ return { } ``` -Note: If you are using [@rollup/plugin-node-resolve](https://www.npmjs.com/package/@rollup/plugin-node-resolve) make sure to place the alias plugin **before** the resolve plugin. +::: warning +If you are using [@rollup/plugin-node-resolve](https://www.npmjs.com/package/@rollup/plugin-node-resolve) make sure to place the alias plugin **before** the resolve plugin. + +::: + +### NuxtJS + +VueTypes provides a NuxtJS module that will automatically enable the shim for production builds: + +```js +// nuxt.config.js + +export default { + // ... + modules: ['vue-types/nuxt'], +} +``` + +The modules accepts a `shim` boolean option to forcefully enable / disable the shim: + +```js +// nuxt.config.js + +export default { + // ... + // use the shim even during development + modules: [['vue-types/nuxt', { shim: true }]], +} +``` + +::: tip +You can configure NuxtJS manually using the `build.extend` method: + +```js +// nuxt.config.js + +export default { + // ... + build: { + extend(config, ctx) { + if (ctx.isDev) { + config.resolve.alias['vue-types'] = 'vue-types/shim' + } + }, + }, +} +``` + +::: ### Vite diff --git a/nuxt/module.js b/nuxt/module.js new file mode 100644 index 00000000..de15f2ab --- /dev/null +++ b/nuxt/module.js @@ -0,0 +1,30 @@ +/* global module, require */ + +/** + * @typedef {Object} ModuleOptions + * + * @property {boolean} [shim] + */ + +/** + * @type {import('@nuxt/types').Module} + * @param {ModuleOptions} moduleOptions + */ +module.exports = function VueTypesModule(moduleOptions = {}) { + this.extendBuild(function (config, ctx) { + if ( + (ctx.isDev && moduleOptions.shim !== true) || + moduleOptions.shim === false + ) { + return + } + if (!config.resolve) { + config.resolve = {} + } + config.resolve.alias = Object.assign(config.resolve.alias || {}, { + 'vue-types': 'vue-types/shim', + }) + }) +} + +module.exports.meta = require('./package.json') diff --git a/nuxt/package.json b/nuxt/package.json new file mode 100644 index 00000000..cefe2f0d --- /dev/null +++ b/nuxt/package.json @@ -0,0 +1,5 @@ +{ + "name": "vue-types-nuxt", + "version": "1.0.0", + "main": "module.js" +} diff --git a/package-lock.json b/package-lock.json index 04045708..e02644cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.0.1", + "version": "4.1.0-beta.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2405,6 +2405,41 @@ "fastq": "^1.6.0" } }, + "@nuxt/types": { + "version": "2.15.7", + "resolved": "https://registry.npmjs.org/@nuxt/types/-/types-2.15.7.tgz", + "integrity": "sha512-jqExebL4Dh5Rn88xVP1/o/a4gxpF7Z1O/kbVjEzEbbvt2E8J0lLc3wsaRYpbqt+S3S9YfvD8FKR85TzkqYtgqw==", + "dev": true, + "requires": { + "@types/autoprefixer": "9.7.2", + "@types/babel__core": "7.1.14", + "@types/compression": "1.7.0", + "@types/connect": "3.4.34", + "@types/etag": "1.8.0", + "@types/file-loader": "5.0.0", + "@types/html-minifier": "4.0.0", + "@types/less": "3.0.2", + "@types/node": "12.20.12", + "@types/optimize-css-assets-webpack-plugin": "5.0.3", + "@types/pug": "2.0.4", + "@types/sass-loader": "8.0.1", + "@types/serve-static": "1.13.9", + "@types/terser-webpack-plugin": "4.2.1", + "@types/webpack": "4.41.28", + "@types/webpack-bundle-analyzer": "3.9.3", + "@types/webpack-dev-middleware": "4.1.2", + "@types/webpack-hot-middleware": "2.25.4", + "sass-loader": "10.1.1" + }, + "dependencies": { + "@types/node": { + "version": "12.20.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.12.tgz", + "integrity": "sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg==", + "dev": true + } + } + }, "@rollup/plugin-alias": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.2.tgz", @@ -2505,6 +2540,99 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/anymatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-3.0.0.tgz", + "integrity": "sha512-qLChUo6yhpQ9k905NwL74GU7TxH+9UODwwQ6ICNI+O6EDMExqH/Cv9NsbmcZ7yC/rRXJ/AHCzfgjsFRY5fKjYw==", + "dev": true, + "requires": { + "anymatch": "*" + } + }, + "@types/autoprefixer": { + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/@types/autoprefixer/-/autoprefixer-9.7.2.tgz", + "integrity": "sha512-QX7U7YW3zX3ex6MECtWO9folTGsXeP4b8bSjTq3I1ODM+H+sFHwGKuof+T+qBcDClGlCGtDb3SVfiTVfmcxw4g==", + "dev": true, + "requires": { + "@types/browserslist": "*", + "postcss": "7.x.x" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@types/babel__core": { "version": "7.1.14", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", @@ -2546,12 +2674,108 @@ "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/browserslist": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@types/browserslist/-/browserslist-4.15.0.tgz", + "integrity": "sha512-h9LyKErRGZqMsHh9bd+FE8yCIal4S0DxKTOeui56VgVXqa66TKiuaIUxCAI7c1O0LjaUzOTcsMyOpO9GetozRA==", + "dev": true, + "requires": { + "browserslist": "*" + } + }, + "@types/clean-css": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", + "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", + "dev": true, + "requires": { + "@types/node": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/compression": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.0.tgz", + "integrity": "sha512-3LzWUM+3k3XdWOUk/RO+uSjv7YWOatYq2QADJntK1pjkk4DfVP0KrIEPDnXRJxAAGKe0VpIPRmlINLDuCedZWw==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/etag": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.0.tgz", + "integrity": "sha512-EdSN0x+Y0/lBv7YAb8IU4Jgm6DWM+Bqtz7o5qozl96fzaqdqbdfHS5qjdpFeIv7xQ8jSLyjMMNShgYtMajEHyQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/file-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/file-loader/-/file-loader-5.0.0.tgz", + "integrity": "sha512-evodFzM0PLOXmMZy8DhPN+toP6QgJiIteF6e8iD9T0xGBUllQA/DAb1nZwCIoNh7vuLvqCGPUdsLf3GSbcHd4g==", + "dev": true, + "requires": { + "@types/webpack": "^4" + } + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -2571,6 +2795,17 @@ "@types/node": "*" } }, + "@types/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-eFnGhrKmjWBlnSGNtunetE3UU2Tc/LUl92htFslSSTmpp9EKHQVcYQadCyYfnzUEFB5G/3wLWo/USQS/mEPKrA==", + "dev": true, + "requires": { + "@types/clean-css": "*", + "@types/relateurl": "*", + "@types/uglify-js": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -2711,6 +2946,18 @@ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, + "@types/less": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/less/-/less-3.0.2.tgz", + "integrity": "sha512-62vfe65cMSzYaWmpmhqCMMNl0khen89w57mByPi1OseGfcV/LV03fO8YVrNj7rFQsRWNJo650WWyh6m7p8vZmA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", @@ -2729,12 +2976,30 @@ "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==", "dev": true }, + "@types/node-sass": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz", + "integrity": "sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PJgbI4KplJfyxKWVrBbEL+rePEBqeozJRMT0mBL3ynhvngASBV/XJ+BneLuJN74RjjMzO0gA5ns80mgubQdZAA==", + "dev": true, + "requires": { + "@types/webpack": "^4" + } + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -2747,12 +3012,36 @@ "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", "dev": true }, + "@types/pug": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz", + "integrity": "sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=", + "dev": true + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/relateurl": { + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.29.tgz", + "integrity": "sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg==", + "dev": true + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -2762,12 +3051,170 @@ "@types/node": "*" } }, + "@types/sass": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", + "integrity": "sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sass-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/sass-loader/-/sass-loader-8.0.1.tgz", + "integrity": "sha512-kum0/5Im5K2WdDTRsLtrXXvX2VJc3rgq9favK+vIdWLn35miWUIYuPkiQlLCHks9//sZ3GWYs4uYzCdmoKKLcQ==", + "dev": true, + "requires": { + "@types/node-sass": "*", + "@types/sass": "*", + "@types/webpack": "^4" + } + }, + "@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/terser-webpack-plugin": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/terser-webpack-plugin/-/terser-webpack-plugin-4.2.1.tgz", + "integrity": "sha512-x688KsgQKJF8PPfv4qSvHQztdZNHLlWJdolN9/ptAGimHVy3rY+vHdfglQDFh1Z39h7eMWOd6fQ7ke3PKQcdyA==", + "dev": true, + "requires": { + "@types/webpack": "^4", + "terser": "^4.6.13" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + } + } + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.28", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.28.tgz", + "integrity": "sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-bundle-analyzer": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.3.tgz", + "integrity": "sha512-l/vaDMWGcXiMB3CbczpyICivLTB07/JNtn1xebsRXE9tPaUDEHgX3x7YP6jfznG5TOu7I4w0Qx1tZz61znmPmg==", + "dev": true, + "requires": { + "@types/webpack": "^4" + } + }, + "@types/webpack-dev-middleware": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-middleware/-/webpack-dev-middleware-4.1.2.tgz", + "integrity": "sha512-SxXzPCqeZ03fJ2dg3iD7cSXvqZymmS5/2GD9fANRcyWN7HYK1H3ty6q7IInXZKvPrdUqij831G3RLIeKK6aGdw==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/webpack": "^4" + } + }, + "@types/webpack-hot-middleware": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/@types/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz", + "integrity": "sha512-6tQb9EBKIANZYUVLQYWiWfDFVe7FhXSj4bB2EF5QB7VtYWL3HDR+y/zqjZPAnCorv0spLqVMRqjRK8AmhfocMw==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/webpack": "^4" + } + }, + "@types/webpack-sources": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.1.tgz", + "integrity": "sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "@types/yargs": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", @@ -13101,6 +13548,12 @@ "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", "dev": true }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -18845,6 +19298,49 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sass-loader": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", + "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "@types/json-schema": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", + "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", diff --git a/package.json b/package.json index d5995fb4..1871548a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "./shim": { "require": "./shim/index.cjs.js", "import": "./shim/index.modern.js" - } + }, + "./nuxt": "./nuxt/module.js" }, "types": "dist/index.d.ts", "engines": { @@ -71,6 +72,7 @@ "devDependencies": { "@babel/plugin-proposal-nullish-coalescing-operator": "7.14.5", "@babel/plugin-proposal-optional-chaining": "7.14.5", + "@nuxt/types": "2.15.7", "@types/jest": "26.0.24", "@types/node": "14.17.5", "@typescript-eslint/eslint-plugin": "4.28.5", From c4975a06a6a1219d040a25e339b42fcb84e428a3 Mon Sep 17 00:00:00 2001 From: Marco Solazzi Date: Sat, 7 Aug 2021 14:25:45 +0900 Subject: [PATCH 29/33] docs: add shim explanation --- docs/guide/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 49fe45bf..f2229782 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -44,7 +44,7 @@ For reference, here is the list of available entry points: ## Production build -If you're using a bundler such as Webpack or rollup, you can shrink VueTypes file size by around **70%** (minified and gzipped) by removing the validation logic while preserving the library's API methods. To achieve that result, VueTypes ships with a `vue-types/shim` module that can be used as alias in production builds. +Vue.js does not validate components' props when used in a production build. If you're using a bundler such as Webpack or rollup, you can shrink VueTypes file size by around **70%** (minified and gzipped) by removing the validation logic while preserving the library's API methods. To achieve that result, VueTypes ships with a `vue-types/shim` module that can be used as alias in production builds. By just aliasing `vue-types` to `vue-types/shim`, bundlers should be able to pick the module type that fits your configuration (ES, CommonJS, ...). From ee6878f477bb4fd8ef70f48bda4a29142e430a8f Mon Sep 17 00:00:00 2001 From: Marco Solazzi Date: Sat, 7 Aug 2021 14:59:40 +0900 Subject: [PATCH 30/33] docs: cdn and webpack docs review --- docs/guide/installation.md | 50 ++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index f2229782..85b48d9b 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -18,7 +18,25 @@ npm install vue-types --save Add the following script tags before your code ```html - + + + + + +``` + +In modern browsers [supporting ES Modules](https://caniuse.com/es6-module) you can import the library like this: + +```html + + + + + ``` ## Usage with bundlers @@ -68,17 +86,10 @@ For reference, here is a table showing the full and shim versions of the library If you're including the library via a `script` tag, use the dedicated shim build file: ```html - + ``` -**Note:** In order to use a specific version of the library change `@latest` with `@`: - -```html - - -``` - -### Webpack 4 and earlier +### Webpack The following example will shim the module in Webpack by adding an [alias field](https://webpack.js.org/configuration/resolve/#resolve-alias) to the configuration when `NODE_ENV` is set to `"production"`: @@ -98,25 +109,6 @@ return { } ``` -### Webpack 5 - -The following example will shim the module in Webpack by adding an [alias field](https://webpack.js.org/configuration/resolve/#resolve-alias) to the configuration when `NODE_ENV` is set to `"production"`: - -```js -// webpack.config.js - -return { - // ... configuration - resolve: { - alias: { - // ... other aliases - 'vue-types': 'vue-types/shim', - }, - }, - }, -} -``` - ### Rollup The following example will shim the module in rollup using [@rollup/plugin-alias](https://www.npmjs.com/package/@rollup/plugin-alias): From 4d3880d3bc5f414dff9b3ff0a947f7399388136b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 8 Aug 2021 05:18:45 +0000 Subject: [PATCH 31/33] Update dependency vite to v2.4.4 --- package-lock.json | 27 ++++++++++++++++++++------- package.json | 2 +- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba356ef8..9fe7f41f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8845,9 +8845,9 @@ "dev": true }, "esbuild": { - "version": "0.12.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.15.tgz", - "integrity": "sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw==", + "version": "0.12.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.19.tgz", + "integrity": "sha512-5NuT1G6THW7l3fsSCDkcPepn24R0XtyPjKoqKHD8LfhqMXzCdz0mrS9HgO6hIhzVT7zt0T+JGbzCqF5AH8hS9w==", "dev": true }, "escalade": { @@ -21422,16 +21422,29 @@ } }, "vite": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.4.1.tgz", - "integrity": "sha512-4BpKRis9uxIqPfIEcJ18LTBsamqnDFxTx45CXwagHjNltHa6PFEvf8Pe6OpgIHb0OyWT30OXOSSQvdOaX4OBiQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.4.4.tgz", + "integrity": "sha512-m1wK6pFJKmaYA6AeZIUXyiAgUAAJzVXhIMYCdZUpCaFMGps0v0IlNJtbmPvkUhVEyautalajmnW5X6NboUPsnw==", "dev": true, "requires": { "esbuild": "^0.12.8", "fsevents": "~2.3.2", - "postcss": "^8.3.5", + "postcss": "^8.3.6", "resolve": "^1.20.0", "rollup": "^2.38.5" + }, + "dependencies": { + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + } } }, "vm-browserify": { diff --git a/package.json b/package.json index 432a55d5..e739dcc2 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "prettier": "2.3.2", "ts-jest": "27.0.4", "typescript": "4.3.5", - "vite": "2.4.1", + "vite": "2.4.4", "vue2": "npm:vue@2.6.14", "vue3": "npm:vue@3.1.5", "vuepress": "1.8.2" From c6fb6bbd0bf81d29fb786b11b2304d86c707296d Mon Sep 17 00:00:00 2001 From: GitHub Release Bot Date: Mon, 9 Aug 2021 02:27:59 +0000 Subject: [PATCH 32/33] Bump version 4.1.0-rc.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fe7f41f..c9837e2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.1.0-beta.3", + "version": "4.1.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e739dcc2..5d6f9567 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.1.0-beta.3", + "version": "4.1.0-rc.1", "description": "Prop types utility for Vue", "author": "Marco Solazzi", "license": "MIT", From 01b713283ac36e1a30520076d3052fccdf4f7fcb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Aug 2021 22:24:12 +0000 Subject: [PATCH 33/33] Update all non-major dependencies --- .node-version | 2 +- .nvmrc | 2 +- package-lock.json | 156 +++++++++++++++++++++++----------------------- package.json | 10 +-- 4 files changed, 85 insertions(+), 85 deletions(-) diff --git a/.node-version b/.node-version index 0627d197..18711d29 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -14.17.4 +14.17.5 diff --git a/.nvmrc b/.nvmrc index 0627d197..18711d29 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.17.4 +14.17.5 diff --git a/package-lock.json b/package-lock.json index c9837e2b..c99959ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2406,9 +2406,9 @@ } }, "@nuxt/types": { - "version": "2.15.7", - "resolved": "https://registry.npmjs.org/@nuxt/types/-/types-2.15.7.tgz", - "integrity": "sha512-jqExebL4Dh5Rn88xVP1/o/a4gxpF7Z1O/kbVjEzEbbvt2E8J0lLc3wsaRYpbqt+S3S9YfvD8FKR85TzkqYtgqw==", + "version": "2.15.8", + "resolved": "https://registry.npmjs.org/@nuxt/types/-/types-2.15.8.tgz", + "integrity": "sha512-zBAG5Fy+SIaZIerOVF1vxy1zz16ZK07QSbsuQAjdtEFlvr+vKK+0AqCv8r8DBY5IVqdMIaw5FgNUz5py0xWdPg==", "dev": true, "requires": { "@types/autoprefixer": "9.7.2", @@ -3197,9 +3197,9 @@ } }, "@types/webpack-sources": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.1.tgz", - "integrity": "sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", "dev": true, "requires": { "@types/node": "*", @@ -3231,13 +3231,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", - "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz", + "integrity": "sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.29.0", - "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/experimental-utils": "4.29.1", + "@typescript-eslint/scope-manager": "4.29.1", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.1.0", @@ -3246,15 +3246,15 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", - "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz", + "integrity": "sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -3271,41 +3271,41 @@ } }, "@typescript-eslint/parser": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", - "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz", + "integrity": "sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "debug": "^4.3.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" } }, "@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", - "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -3314,12 +3314,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/types": "4.29.1", "eslint-visitor-keys": "^2.0.0" } }, @@ -3500,14 +3500,14 @@ } }, "@vue/compiler-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.5.tgz", - "integrity": "sha512-TXBhFinoBaXKDykJzY26UEuQU1K07FOp/0Ie+OXySqqk0bS0ZO7Xvl7UmiTUPYcLrWbxWBR7Bs/y55AI0MNc2Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.2.tgz", + "integrity": "sha512-QhCI0ZU5nAR0LMcLgzW3v75374tIrHGp8XG5CzJS7Nsy+iuignbE4MZ2XJfh5TGIrtpuzfWA4eTIfukZf/cRdg==", "dev": true, "requires": { "@babel/parser": "^7.12.0", "@babel/types": "^7.12.0", - "@vue/shared": "3.1.5", + "@vue/shared": "3.2.2", "estree-walker": "^2.0.1", "source-map": "^0.6.1" }, @@ -3527,13 +3527,13 @@ } }, "@vue/compiler-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.1.5.tgz", - "integrity": "sha512-ZsL3jqJ52OjGU/YiT/9XiuZAmWClKInZM2aFJh9gnsAPqOrj2JIELMbkIFpVKR/CrVO/f2VxfPiiQdQTr65jcQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.2.tgz", + "integrity": "sha512-ggcc+NV/ENIE0Uc3TxVE/sKrhYVpLepMAAmEiQ047332mbKOvUkowz4TTFZ+YkgOIuBOPP0XpCxmCMg7p874mA==", "dev": true, "requires": { - "@vue/compiler-core": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/compiler-core": "3.2.2", + "@vue/shared": "3.2.2" } }, "@vue/component-compiler-utils": { @@ -3651,39 +3651,39 @@ } }, "@vue/reactivity": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", - "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.2.tgz", + "integrity": "sha512-IHjhtmrhK6dzacj/EnLQDWOaA3HuzzVk6w84qgV8EpS4uWGIJXiRalMRg6XvGW2ykJvIl3pLsF0aBFlTMRiLOA==", "dev": true, "requires": { - "@vue/shared": "3.1.5" + "@vue/shared": "3.2.2" } }, "@vue/runtime-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.1.5.tgz", - "integrity": "sha512-YQbG5cBktN1RowQDKA22itmvQ+b40f0WgQ6CXK4VYoYICAiAfu6Cc14777ve8zp1rJRGtk5oIeS149TOculrTg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.2.tgz", + "integrity": "sha512-/aUk1+GO/VPX0oVxhbzSWE1zrf3/wGCsO1ALNisVokYftKqfqLDjbJHE6mrI2hx3MiuwbHrWjJClkGUVTIOPEQ==", "dev": true, "requires": { - "@vue/reactivity": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/reactivity": "3.2.2", + "@vue/shared": "3.2.2" } }, "@vue/runtime-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.1.5.tgz", - "integrity": "sha512-tNcf3JhVR0RfW0kw1p8xZgv30nvX8Y9rsz7eiQ0dHe273sfoCngAG0y4GvMaY4Xd8FsjUwFedd4suQ8Lu8meXg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.2.tgz", + "integrity": "sha512-1Le/NpCfawCOfePfJezvWUF+oCVLU8N+IHN4oFDOxRe6/PgHNJ+yT+YdxFifBfI+TIAoXI/9PsnqzmJZV+xsmw==", "dev": true, "requires": { - "@vue/runtime-core": "3.1.5", - "@vue/shared": "3.1.5", + "@vue/runtime-core": "3.2.2", + "@vue/shared": "3.2.2", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", - "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.2.tgz", + "integrity": "sha512-dvYb318tk9uOzHtSaT3WII/HscQSIRzoCZ5GyxEb3JlkEXASpAUAQwKnvSe2CudnF8XHFRTB7VITWSnWNLZUtA==", "dev": true }, "@vuepress/core": { @@ -9109,9 +9109,9 @@ } }, "eslint-plugin-vue": { - "version": "7.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.15.1.tgz", - "integrity": "sha512-4/r+n/i+ovyeW2gVRRH92kpy4lkpFbyPR4BMxGBTLtGnwqOKKzjSo6EMSaT0RhWPvEjK9uifcY8e7z5n8BIEgw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.16.0.tgz", + "integrity": "sha512-0E2dVvVC7I2Xm1HXyx+ZwPj9CNX4NJjs4K4r+GVsHWyt5Pew3JLD4fI7A91b2jeL0TXE7LlszrwLSTJU9eqehw==", "dev": true, "requires": { "eslint-utils": "^2.1.0", @@ -19312,9 +19312,9 @@ }, "dependencies": { "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "loader-utils": { @@ -21590,14 +21590,14 @@ "dev": true }, "vue3": { - "version": "npm:vue@3.1.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.1.5.tgz", - "integrity": "sha512-Ho7HNb1nfDoO+HVb6qYZgeaobt1XbY6KXFe4HGs1b9X6RhkWG/113n4/SrtM1LUclM6OrP/Se5aPHHvAPG1iVQ==", + "version": "npm:vue@3.2.2", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.2.tgz", + "integrity": "sha512-D/LuzAV30CgNJYGyNheE/VUs5N4toL2IgmS6c9qeOxvyh0xyn4exyRqizpXIrsvfx34zG9x5gCI2tdRHCGvF9w==", "dev": true, "requires": { - "@vue/compiler-dom": "3.1.5", - "@vue/runtime-dom": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/compiler-dom": "3.2.2", + "@vue/runtime-dom": "3.2.2", + "@vue/shared": "3.2.2" } }, "vuepress": { diff --git a/package.json b/package.json index 5d6f9567..8c70d0ca 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,11 @@ "devDependencies": { "@babel/plugin-proposal-nullish-coalescing-operator": "7.14.5", "@babel/plugin-proposal-optional-chaining": "7.14.5", - "@nuxt/types": "2.15.7", + "@nuxt/types": "2.15.8", "@types/jest": "26.0.24", "@types/node": "14.17.9", - "@typescript-eslint/eslint-plugin": "4.29.0", - "@typescript-eslint/parser": "4.29.0", + "@typescript-eslint/eslint-plugin": "4.29.1", + "@typescript-eslint/parser": "4.29.1", "babel-plugin-transform-node-env-inline": "0.4.3", "cpy-cli": "3.1.1", "cross-env": "7.0.3", @@ -86,7 +86,7 @@ "eslint-config-prettier": "8.3.0", "eslint-plugin-node": "11.1.0", "eslint-plugin-prettier": "3.4.0", - "eslint-plugin-vue": "7.15.1", + "eslint-plugin-vue": "7.16.0", "jest": "27.0.6", "microbundle": "0.13.3", "npm-run-all": "4.1.5", @@ -95,7 +95,7 @@ "typescript": "4.3.5", "vite": "2.4.4", "vue2": "npm:vue@2.6.14", - "vue3": "npm:vue@3.1.5", + "vue3": "npm:vue@3.2.2", "vuepress": "1.8.2" }, "dependencies": {