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/.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/__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}`) + }) +}) 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/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..6bfc5caa --- /dev/null +++ b/docs/advanced/typescript.md @@ -0,0 +1,239 @@ +# TypeScript Usage + +VueTypes is written in TypeScript and comes with full builtin types support. + +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 TS typing. + +### 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 type event 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 + +The validator accepts an argument defining the contained items type. + +```ts +interface User { + name: string + // ... +} + +props: { + // array of numbers + sizes: array() + // array of users + 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) + // 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(), + }) +} +``` + +### 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', + ) +} +``` + +::: + +### 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') +} +``` 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`. diff --git a/docs/guide/installation.md b/docs/guide/installation.md index b28734e2..85b48d9b 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -18,69 +18,78 @@ 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 -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. +Modern bundlers and tools should be able to automatically pick the correct entry point based on your configuration. -Anyway, here is the list of available entry points: +```js +import { string, oneOf } from 'vue-types' // or: import VueTypes from 'vue-types'; +``` + +::: 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/) - `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 `@`: +For reference, here is a table showing the full and shim versions of the library for each module system. -```html - - -``` +| Module system | Full Library entry point | Shim entry point | +| ------------- | ------------------------ | ---------------------- | +| Modern ES | `vue-types.modern.js` | `shim/index.modern.js` | +| ES5 ES | `vue-types.m.js` | `shim/index.m.js` | +| CommonJS | `vue-types.cjs` | `shim/index.cjs.js` | +| UMD | `vue-types.umd.js` | `shim/index.umd.js` | -### Webpack 4 and earlier +::: -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"`: +### CDN usage -```js -// webpack.config.js +If you're including the library via a `script` tag, use the dedicated shim build file: -return { - // ... configuration - resolve: { - alias: { - // ... other aliases - ...(process.env.NODE_ENV === 'production' && { - 'vue-types': require.resolve('vue-types/dist/shim.m.js'), - }), - }, - }, -} +```html + ``` -### Webpack 5 +### 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"`: @@ -92,8 +101,9 @@ return { resolve: { alias: { // ... other aliases - 'vue-types': 'vue-types/shim', - }, + ...(process.env.NODE_ENV === 'production' && { + 'vue-types': 'vue-types/shim', + }), }, }, } @@ -120,7 +130,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/docs/guide/validators.md b/docs/guide/validators.md index e4582dc7..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. @@ -88,12 +102,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 +119,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 +165,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 +190,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 +205,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 +227,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 +241,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. @@ -274,7 +331,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: { @@ -283,6 +340,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. @@ -303,10 +383,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 @@ -350,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 } @@ -426,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. 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..de20f7b2 --- /dev/null +++ b/examples/shared/custom-namespace.ts @@ -0,0 +1,64 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +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..da05a2ac --- /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: unknown): 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..085f4549 --- /dev/null +++ b/examples/shared/validators.ts @@ -0,0 +1,194 @@ +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() +export const anyTypeCast = 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 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) + +/** + * `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) +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 + */ +type stringTuple = 'one' | 'two' +type UserOneOf = { name: string } +export const stringOrNumberOrBoolType = oneOfType([ + { type: String }, + Number, + bool(), +]) + +export const stringOrObject = oneOfType([String, Object]) +export const stringOrObjectCast = oneOfType([ + String, + Object, +]) +export const stringOrCastedObject = oneOfType([String, object()]) + +export const castedStringOrCastedObject = oneOfType([ + string(), + object(), +]).def('one') + +/** + * `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] }) +type UserArrayOf = { name: string } + +export const arrayOfCastedTypes = arrayOf( + oneOfType([object(), array()]), +) + +/** + * `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..21baa029 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -1,17 +1,20 @@ { "compilerOptions": { - "target": "ES5", + "target": "esnext", + "module": "esnext", + "lib": ["esnext", "dom"], + "resolveJsonModule": true, + "esModuleInterop": true, + "moduleResolution": "node", + "strict": true, + "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..9bc0b624 --- /dev/null +++ b/examples/vue2/test-components/index.ts @@ -0,0 +1,52 @@ +import Vue 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..0bdbb167 --- /dev/null +++ b/examples/vue2/test-components/single.ts @@ -0,0 +1,41 @@ +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), +}) + +new Vue({ + render: (h) => h(UserProfile), +}) 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..8fd07ef7 --- /dev/null +++ b/examples/vue3/test-components/single.ts @@ -0,0 +1,41 @@ +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), +}) +createApp({ + render: () => h(UserProfile), +}) 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 @@ + + 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/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 a40de195..c99959ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.0.3", + "version": "4.1.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2405,6 +2405,41 @@ "fastq": "^1.6.0" } }, + "@nuxt/types": { + "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", + "@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-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==", "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": "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": "*", + "@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", @@ -2784,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", @@ -2799,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" }, @@ -2824,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", @@ -2867,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" } }, @@ -3053,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" }, @@ -3080,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": { @@ -3204,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": { @@ -4326,12 +4773,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 +5037,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 +5090,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 +5155,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 +5366,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 +5427,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 +5458,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 +5471,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", @@ -5282,75 +5673,11 @@ "duplexer": "0.1.1" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browser-sync": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.5.tgz", - "integrity": "sha512-0GMEPDqccbTxwYOUGCk5AZloDj9I/1eDZCLXUKXu7iBJPznGGOnMHs88mrhaFL0fTA0R23EmsXX9nLZP+k5YzA==", - "dev": true, - "requires": { - "browser-sync-client": "^2.27.5", - "browser-sync-ui": "^2.27.5", - "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.5", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.5.tgz", - "integrity": "sha512-l2jtf60/exv0fQiZkhi3z8RgexYYLGS7DVDnyepkrp+oFAPlKW69daL6NrVSgrwu6lzSTCCTAiPXnUSrQ57e/Q==", - "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.5", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.5.tgz", - "integrity": "sha512-KxBJhQ6XNbQ8w8UlkPa9/J5R0nBHgHuJUtDpEXQx1jBapDy32WGzD0NENDozP4zGNvJUgZk3N80hqB7YCieC3g==", - "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" - } + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true }, "browserify-aes": { "version": "1.2.0", @@ -5460,18 +5787,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 +6134,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 +6427,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 +6535,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 +6608,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", @@ -8193,12 +8462,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", @@ -8233,12 +8496,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", @@ -8396,24 +8653,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", @@ -8492,80 +8731,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", @@ -8679,6 +8844,12 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, + "esbuild": { + "version": "0.12.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.19.tgz", + "integrity": "sha512-5NuT1G6THW7l3fsSCDkcPepn24R0XtyPjKoqKHD8LfhqMXzCdz0mrS9HgO6hIhzVT7zt0T+JGbzCqF5AH8hS9w==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -8938,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", @@ -9654,38 +9825,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", @@ -9805,17 +9944,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", @@ -10098,21 +10226,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", @@ -10687,12 +10800,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", @@ -10802,12 +10909,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", @@ -10916,6 +11017,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" } @@ -11099,15 +11201,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", @@ -13410,15 +13503,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", @@ -13464,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", @@ -13505,12 +13595,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", @@ -13590,35 +13674,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", @@ -13658,12 +13713,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", @@ -14117,12 +14166,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", @@ -14254,12 +14297,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", @@ -14992,21 +15029,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", @@ -15338,18 +15360,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", @@ -15511,16 +15521,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", @@ -18572,12 +18572,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", @@ -18644,18 +18638,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", @@ -18755,6 +18737,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" } @@ -19042,33 +19025,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", @@ -19303,22 +19259,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "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" + "aproba": "^1.1.1" } }, "sade": { @@ -19357,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.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": { + "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", @@ -19445,74 +19429,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", @@ -19584,24 +19500,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", @@ -19868,118 +19766,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", @@ -20242,12 +20028,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", @@ -20273,16 +20053,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", @@ -20716,12 +20486,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", @@ -20952,16 +20716,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", @@ -21021,12 +20775,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", @@ -21243,12 +20991,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", @@ -21679,6 +21421,32 @@ "extsprintf": "^1.2.0" } }, + "vite": { + "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.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": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -21822,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": { @@ -23296,12 +23064,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", @@ -23326,101 +23088,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 f1530c1d..8c70d0ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-types", - "version": "4.0.3", + "version": "4.1.0-rc.1", "description": "Prop types utility for Vue", "author": "Marco Solazzi", "license": "MIT", @@ -22,9 +22,10 @@ "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" + }, + "./nuxt": "./nuxt/module.js" }, "types": "dist/index.d.ts", "engines": { @@ -32,22 +33,27 @@ }, "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": "eslint '{src,__tests__,.}/**/*.{ts,js,cjs}'", - "lint:examples": "tsc --noEmit -p ./examples", - "examples": "cross-env NODE_ENV=development node ./scripts/run-examples.cjs", + "lint": "run-s lint:*", + "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", "docs:build": "cross-env NODE_ENV=production vuepress build docs" }, @@ -66,12 +72,12 @@ "devDependencies": { "@babel/plugin-proposal-nullish-coalescing-operator": "7.14.5", "@babel/plugin-proposal-optional-chaining": "7.14.5", + "@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", - "browser-sync": "2.27.5", "cpy-cli": "3.1.1", "cross-env": "7.0.3", "del": "6.0.0", @@ -80,15 +86,16 @@ "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", "prettier": "2.3.2", "ts-jest": "27.0.4", "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": { 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`, - }) -})() 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" + } +} 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 } diff --git a/src/validators/native.ts b/src/validators/native.ts index d0b4bc5a..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', { @@ -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) }, diff --git a/src/validators/oneoftype.ts b/src/validators/oneoftype.ts index 9ed666a7..798315e3 100644 --- a/src/validators/oneoftype.ts +++ b/src/validators/oneoftype.ts @@ -11,7 +11,8 @@ import { } from '../utils' export default function oneOfType< - U extends VueProp | Prop, + D extends V, + U extends VueProp | Prop = any, V = InferType, >(arr: U[]) { if (!isArray(arr)) { @@ -38,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) } @@ -49,16 +53,18 @@ export default function oneOfType< // filter duplicates nativeChecks = nativeChecks.filter((t, i) => nativeChecks.indexOf(t) === i) + 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, + return toType('oneOfType', { + type: typeProp as unknown as PropType, }) } - return toType('oneOfType', { - type: nativeChecks, + return toType('oneOfType', { + type: typeProp as unknown as PropType, validator(value) { const err: string[] = [] const valid = arr.some((type) => {