diff --git a/.github/semantic.yml b/.github/semantic.yml index bcbb33330b..7062e1c2e8 100644 --- a/.github/semantic.yml +++ b/.github/semantic.yml @@ -166,6 +166,57 @@ scopes: - elements-react|ino-table-row - elements-react|ino-textarea - elements-react|ino-tooltip + - elements-vue|ino-autocomplete + - elements-vue|ino-button + - elements-vue|ino-card + - elements-vue|ino-carousel + - elements-vue|ino-carousel-slide + - elements-vue|ino-checkbox + - elements-vue|ino-chip + - elements-vue|ino-chip-set + - elements-vue|ino-control-item + - elements-vue|ino-currency-input + - elements-vue|ino-datepicker + - elements-vue|ino-dialog + - elements-vue|ino-fab + - elements-vue|ino-fab-set + - elements-vue|ino-form-row + - elements-vue|ino-header + - elements-vue|ino-icon + - elements-vue|ino-icon-button + - elements-vue|ino-img + - elements-vue|ino-img-list + - elements-vue|ino-input + - elements-vue|ino-input-file + - elements-vue|ino-label + - elements-vue|ino-list + - elements-vue|ino-list-divider + - elements-vue|ino-list-item + - elements-vue|ino-markdown-editor + - elements-vue|ino-menu + - elements-vue|ino-nav-drawer + - elements-vue|ino-nav-item + - elements-vue|ino-option + - elements-vue|ino-option-group + - elements-vue|ino-popover + - elements-vue|ino-progress-bar + - elements-vue|ino-radio + - elements-vue|ino-radio-group + - elements-vue|ino-range + - elements-vue|ino-segment-button + - elements-vue|ino-segment-group + - elements-vue|ino-select + - elements-vue|ino-sidebar + - elements-vue|ino-snackbar + - elements-vue|ino-spinner + - elements-vue|ino-switch + - elements-vue|ino-tab + - elements-vue|ino-tab-bar + - elements-vue|ino-table + - elements-vue|ino-table-cell + - elements-vue|ino-table-row + - elements-vue|ino-textarea + - elements-vue|ino-tooltip - storybook|ino-autocomplete - storybook|ino-button - storybook|ino-card @@ -220,6 +271,7 @@ scopes: - elements - elements-angular - elements-react + - elements-vue - storybook - landingpage - '*' diff --git a/packages/elements-vue/README.md b/packages/elements-vue/README.md new file mode 100644 index 0000000000..342e27cffd --- /dev/null +++ b/packages/elements-vue/README.md @@ -0,0 +1,15 @@ +# @inovex.de/elements-vue + +This is the integration layer package for integrating the inovex elements into Vue projects. + +## Installation + +See [instructions](https://github.com/inovex/elements/tree/master/packages/storybook/src/stories/docs/framework-integration) how to integrate it into your project. + +## Contributing + +Please refer to the top level [README at GitHub](https://github.com/inovex/elements) to see the available script commands. + +## License + +MIT diff --git a/packages/elements-vue/package.json b/packages/elements-vue/package.json new file mode 100644 index 0000000000..7504b6cde5 --- /dev/null +++ b/packages/elements-vue/package.json @@ -0,0 +1,38 @@ +{ + "name": "@inovex.de/elements-vue", + "version": "6.0.0", + "description": "This is the Vue.js package of the integration layer for @inovex/elements.", + "keywords": [ + "vue3", + "elements", + "vue" + ], + "author": "Benjamin Pagelsdorf ", + "homepage": "https://elements.inovex.de", + "bugs": { + "url": "https://github.com/inovex/elements/issues" + }, + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.esm.js", + "types": "./dist/types/index.d.ts", + "files": [ + "dist/" + ], + "scripts": { + "build": "npm run clean && npm run compile", + "clean": "shx rm -rf dist", + "compile": "npm run tsc", + "tsc": "tsc -p ." + }, + "dependencies": { + "@inovex.de/elements": "6.0.0" + }, + "devDependencies": { + "@stencil/core": "^2.14.0", + "shx": "^0.3.2", + "typescript": "^4.2.4", + "vue": "^3.0.0", + "vue-router": "^4.0.0" + } +} diff --git a/packages/elements-vue/src/index.ts b/packages/elements-vue/src/index.ts new file mode 100644 index 0000000000..2c84cb3387 --- /dev/null +++ b/packages/elements-vue/src/index.ts @@ -0,0 +1,24 @@ +import { defineCustomElements } from '@inovex.de/elements/dist/loader'; + +const toKebabCase = (eventName: string) => { + if (eventName.startsWith('MDC')) + return eventName; + if (eventName === 'valueChange') + return 'v-value-change'; + if (eventName === 'checkedChange') + return 'v-checked-change'; + return eventName.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase(); +}; + +const getHelperFunctions = () => { + return { + ael: (el: any, eventName: string, cb: any, opts: any) => el.addEventListener(toKebabCase(eventName), cb, opts), + rel: (el: any, eventName: string, cb: any, opts: any) => el.removeEventListener(toKebabCase(eventName), cb, opts), + ce: (eventName: string, opts: any) => new CustomEvent(toKebabCase(eventName), opts) + }; +}; + +void defineCustomElements(window, getHelperFunctions()); + +export * from './proxies'; + diff --git a/packages/elements-vue/src/proxies.ts b/packages/elements-vue/src/proxies.ts new file mode 100644 index 0000000000..b7279ddf11 --- /dev/null +++ b/packages/elements-vue/src/proxies.ts @@ -0,0 +1,540 @@ +/* eslint-disable */ +/* tslint:disable */ +/* auto-generated vue proxies */ +import { defineContainer } from './vue-component-lib/utils'; + +import type { JSX } from '@inovex.de/elements'; + + + +export const InoAutocomplete = /*@__PURE__*/ defineContainer('ino-autocomplete', undefined, [ + 'debounceTimeout', + 'noOptionsText', + 'value', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoButton = /*@__PURE__*/ defineContainer('ino-button', undefined, [ + 'autoFocus', + 'disabled', + 'name', + 'form', + 'type', + 'colorScheme', + 'edgeMirrored', + 'fill', + 'dense', + 'loading' +]); + + +export const InoCard = /*@__PURE__*/ defineContainer('ino-card', undefined, [ + 'selected', + 'disableElevation' +]); + + +export const InoCarousel = /*@__PURE__*/ defineContainer('ino-carousel', undefined, [ + 'value', + 'autoplay', + 'animated', + 'hideButtons', + 'infinite', + 'intermission', + 'reverse' +]); + + +export const InoCarouselSlide = /*@__PURE__*/ defineContainer('ino-carousel-slide', undefined, [ + 'src', + 'value' +]); + + +export const InoCheckbox = /*@__PURE__*/ defineContainer('ino-checkbox', undefined, [ + 'checked', + 'disabled', + 'name', + 'value', + 'selection', + 'indeterminate', + 'checkedChange' +], +'checked', 'v-checked-change', 'checkedChange'); + + +export const InoChip = /*@__PURE__*/ defineContainer('ino-chip', undefined, [ + 'colorScheme', + 'disabled', + 'fill', + 'label', + 'removable', + 'selectable', + 'selected', + 'value', + 'chipClicked', + 'chipRemoved' +]); + + +export const InoControlItem = /*@__PURE__*/ defineContainer('ino-control-item', undefined, [ + 'role', + 'text', + 'secondaryText', + 'selected', + 'activated', + 'checked', + 'disabled', + 'name', + 'value', + 'indeterminate', + 'trailing', + 'checkedChange' +], +'checked', 'v-checked-change', 'checkedChange'); + + +export const InoCurrencyInput = /*@__PURE__*/ defineContainer('ino-currency-input', undefined, [ + 'currencyLocale', + 'value', + 'valueChange' +]); + + +export const InoDatepicker = /*@__PURE__*/ defineContainer('ino-datepicker', undefined, [ + 'autoFocus', + 'appendTo', + 'disabled', + 'name', + 'placeholder', + 'required', + 'showLabelHint', + 'value', + 'min', + 'max', + 'outline', + 'label', + 'helper', + 'helperPersistent', + 'helperValidation', + 'inline', + 'range', + 'attachToBody', + 'dateFormat', + 'defaultDate', + 'defaultHour', + 'defaultMinute', + 'twelveHourTime', + 'type', + 'minuteStep', + 'hourStep', + 'error', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoDialog = /*@__PURE__*/ defineContainer('ino-dialog', undefined, [ + 'attachTo', + 'fullwidth', + 'dismissible', + 'open', + 'close' +]); + + +export const InoFab = /*@__PURE__*/ defineContainer('ino-fab', undefined, [ + 'icon', + 'label', + 'extended', + 'edgePosition', + 'disabled', + 'mini', + 'tooltipPlacement' +]); + + +export const InoFabSet = /*@__PURE__*/ defineContainer('ino-fab-set', undefined, [ + 'dialDirection', + 'topBottomLocation', + 'leftRightLocation', + 'openDial' +]); + + +export const InoFormRow = /*@__PURE__*/ defineContainer('ino-form-row', undefined, [ + 'label', + 'mandatory' +]); + + +export const InoHeader = /*@__PURE__*/ defineContainer('ino-header', undefined, [ + 'text' +]); + + +export const InoIcon = /*@__PURE__*/ defineContainer('ino-icon', undefined, [ + 'icon', + 'colorSecondary', + 'clickable', + 'src', + 'svgTitle', + 'clickEl' +]); + + +export const InoIconButton = /*@__PURE__*/ defineContainer('ino-icon-button', undefined, [ + 'autoFocus', + 'disabled', + 'activated', + 'colorScheme', + 'filled', + 'icon', + 'type', + 'clickEl' +]); + + +export const InoImg = /*@__PURE__*/ defineContainer('ino-img', undefined, [ + 'alt', + 'decoding', + 'height', + 'sizes', + 'src', + 'srcset', + 'width', + 'usemap', + 'fallbackIcon', + 'imgListItem', + 'label', + 'ratioWidth', + 'ratioHeight', + 'rounded' +]); + + +export const InoImgList = /*@__PURE__*/ defineContainer('ino-img-list', undefined, [ + 'masonry', + 'encloseLabel' +]); + + +export const InoInput = /*@__PURE__*/ defineContainer('ino-input', undefined, [ + 'autocomplete', + 'autoFocus', + 'dataList', + 'disabled', + 'error', + 'helper', + 'helperCharacterCounter', + 'helperPersistent', + 'helperValidation', + 'label', + 'min', + 'max', + 'maxlength', + 'name', + 'outline', + 'pattern', + 'placeholder', + 'required', + 'showLabelHint', + 'size', + 'step', + 'type', + 'unit', + 'value', + 'resetOnChange', + 'inoBlur', + 'inoFocus', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoInputFile = /*@__PURE__*/ defineContainer('ino-input-file', undefined, [ + 'accept', + 'autoFocus', + 'disabled', + 'multiple', + 'name', + 'required', + 'label', + 'dragAndDrop', + 'dragAndDropText', + 'dragAndDropSecondaryText', + 'changeFile' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoLabel = /*@__PURE__*/ defineContainer('ino-label', undefined, [ + 'outline', + 'text', + 'required', + 'showHint', + 'disabled' +]); + + +export const InoList = /*@__PURE__*/ defineContainer('ino-list', undefined, [ + 'dense', + 'twoLines', + 'avatar' +]); + + +export const InoListDivider = /*@__PURE__*/ defineContainer('ino-list-divider', undefined, [ + 'betweenLists', + 'padded', + 'inset' +]); + + +export const InoListItem = /*@__PURE__*/ defineContainer('ino-list-item', undefined, [ + 'text', + 'secondaryText', + 'selected', + 'activated', + 'disabled', + 'clickEl' +]); + + +export const InoMarkdownEditor = /*@__PURE__*/ defineContainer('ino-markdown-editor', undefined, [ + 'initialValue', + 'viewMode', + 'viewModeChange', + 'valueChange', + 'inoBlur' +]); + + +export const InoMenu = /*@__PURE__*/ defineContainer('ino-menu', undefined, [ + 'placement' +]); + + +export const InoNavDrawer = /*@__PURE__*/ defineContainer('ino-nav-drawer', undefined, [ + 'open', + 'anchor', + 'variant', + 'openChange' +]); + + +export const InoNavItem = /*@__PURE__*/ defineContainer('ino-nav-item', undefined, [ + 'text', + 'subText', + 'activated', + 'disabled' +]); + + +export const InoOption = /*@__PURE__*/ defineContainer('ino-option', undefined, [ + 'disabled', + 'selected', + 'value', + 'clickEl' +]); + + +export const InoOptionGroup = /*@__PURE__*/ defineContainer('ino-option-group', undefined, [ + 'label' +]); + + +export const InoPopover = /*@__PURE__*/ defineContainer('ino-popover', undefined, [ + 'placement', + 'for', + 'hideOnBlur', + 'hideOnEsc', + 'distance', + 'colorScheme', + 'interactive', + 'trigger', + 'controlled', + 'visible', + 'visibleChanged' +]); + + +export const InoProgressBar = /*@__PURE__*/ defineContainer('ino-progress-bar', undefined, [ + 'buffer', + 'indeterminate', + 'label', + 'progress' +]); + + +export const InoRadio = /*@__PURE__*/ defineContainer('ino-radio', undefined, [ + 'checked', + 'disabled', + 'name', + 'value', + 'checkedChange' +], +'checked', 'v-checked-change', 'checkedChange'); + + +export const InoRadioGroup = /*@__PURE__*/ defineContainer('ino-radio-group', undefined, [ + 'value' +]); + + +export const InoRange = /*@__PURE__*/ defineContainer('ino-range', undefined, [ + 'disabled', + 'colorScheme', + 'discrete', + 'markers', + 'name', + 'min', + 'max', + 'value', + 'step', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoSegmentButton = /*@__PURE__*/ defineContainer('ino-segment-button', undefined, [ + 'checked', + 'disabled', + 'dense', + 'name', + 'value', + 'checkedChange' +], +'checked', 'v-checked-change', 'checkedChange'); + + +export const InoSegmentGroup = /*@__PURE__*/ defineContainer('ino-segment-group', undefined, [ + 'name', + 'value' +]); + + +export const InoSelect = /*@__PURE__*/ defineContainer('ino-select', undefined, [ + 'disabled', + 'name', + 'required', + 'showLabelHint', + 'label', + 'outline', + 'value', + 'error', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoSidebar = /*@__PURE__*/ defineContainer('ino-sidebar', undefined, [ + 'alignRight', + 'open', + 'name', + 'openChange' +]); + + +export const InoSnackbar = /*@__PURE__*/ defineContainer('ino-snackbar', undefined, [ + 'message', + 'actionText', + 'type', + 'timeout', + 'stayVisibleOnHover', + 'actionClick', + 'hideEl' +]); + + +export const InoSpinner = /*@__PURE__*/ defineContainer('ino-spinner', undefined, [ + 'type', + 'colorScheme', + 'modal', + 'height', + 'width' +]); + + +export const InoSwitch = /*@__PURE__*/ defineContainer('ino-switch', undefined, [ + 'checked', + 'disabled', + 'name', + 'colorScheme', + 'checkedChange' +], +'checked', 'v-checked-change', 'checkedChange'); + + +export const InoTab = /*@__PURE__*/ defineContainer('ino-tab', undefined, [ + 'icon', + 'label', + 'stacked', + 'indicatorContentWidth', + 'interacted' +]); + + +export const InoTabBar = /*@__PURE__*/ defineContainer('ino-tab-bar', undefined, [ + 'activeTab', + 'autoFocus', + 'activeTabChange' +]); + + +export const InoTable = /*@__PURE__*/ defineContainer('ino-table', undefined, [ + 'loading', + 'noHover', + 'sortColumnId', + 'sortDirection', + 'stickyHeader', + 'sortChange' +]); + + +export const InoTableHeaderCell = /*@__PURE__*/ defineContainer('ino-table-header-cell', undefined, [ + 'autofocus', + 'searchIcon', + 'columnId', + 'label', + 'searched', + 'notSortable', + 'sortDirection', + 'sortStart', + 'sortDirectionChange', + 'searchFocusChange' +]); + + +export const InoTextarea = /*@__PURE__*/ defineContainer('ino-textarea', undefined, [ + 'autoFocus', + 'cols', + 'disabled', + 'maxlength', + 'minlength', + 'showCharacterCounter', + 'name', + 'placeholder', + 'required', + 'showLabelHint', + 'rows', + 'value', + 'outline', + 'autogrow', + 'label', + 'inoBlur', + 'valueChange' +], +'value', 'v-value-change', 'valueChange'); + + +export const InoTooltip = /*@__PURE__*/ defineContainer('ino-tooltip', undefined, [ + 'colorScheme', + 'placement', + 'for', + 'trigger', + 'label' +]); + diff --git a/packages/elements-vue/src/vue-component-lib/utils.ts b/packages/elements-vue/src/vue-component-lib/utils.ts new file mode 100644 index 0000000000..4ba80a2310 --- /dev/null +++ b/packages/elements-vue/src/vue-component-lib/utils.ts @@ -0,0 +1,198 @@ +import { VNode, defineComponent, getCurrentInstance, h, inject, ref, Ref } from 'vue'; + +export interface InputProps extends Object { + modelValue: string | boolean; +} + +const UPDATE_VALUE_EVENT = 'update:modelValue'; +const MODEL_VALUE = 'modelValue'; +const ROUTER_LINK_VALUE = 'routerLink'; +const NAV_MANAGER = 'navManager'; +const ROUTER_PROP_PREFIX = 'router'; + +/** + * Starting in Vue 3.1.0, all properties are + * added as keys to the props object, even if + * they are not being used. In order to correctly + * account for both value props and v-model props, + * we need to check if the key exists for Vue <3.1.0 + * and then check if it is not undefined for Vue >= 3.1.0. + * See https://github.com/vuejs/vue-next/issues/3889 + */ +const EMPTY_PROP = Symbol(); +const DEFAULT_EMPTY_PROP = { default: EMPTY_PROP }; + +interface NavManager { + navigate: (options: T) => void; +} + +const getComponentClasses = (classes: unknown) => { + return (classes as string)?.split(' ') || []; +}; + +const getElementClasses = (ref: Ref, componentClasses: Set, defaultClasses: string[] = []) => { + return [ ...Array.from(ref.value?.classList || []), ...defaultClasses ] + .filter((c: string, i, self) => !componentClasses.has(c) && self.indexOf(c) === i); +}; + +/** +* Create a callback to define a Vue component wrapper around a Web Component. +* +* @prop name - The component tag name (i.e. `ion-button`) +* @prop componentProps - An array of properties on the +* component. These usually match up with the @Prop definitions +* in each component's TSX file. +* @prop customElement - An option custom element instance to pass +* to customElements.define. Only set if `includeImportCustomElements: true` in your config. +* @prop modelProp - The prop that v-model binds to (i.e. value) +* @prop modelUpdateEvent - The event that is fired from your Web Component when the value changes (i.e. ionChange) +* @prop externalModelUpdateEvent - The external event to fire from your Vue component when modelUpdateEvent fires. This is used for ensuring that v-model references have been +* correctly updated when a user's event callback fires. +*/ +export const defineContainer = ( + name: string, + defineCustomElement: any, + componentProps: string[] = [], + modelProp?: string, + modelUpdateEvent?: string, + externalModelUpdateEvent?: string +) => { + /** + * Create a Vue component wrapper around a Web Component. + * Note: The `props` here are not all properties on a component. + * They refer to whatever properties are set on an instance of a component. + */ + + if (defineCustomElement !== undefined) { + defineCustomElement(); + } + + const Container = defineComponent((props: any, { attrs, slots, emit }) => { + let modelPropValue = props[modelProp]; + const containerRef = ref(); + const classes = new Set(getComponentClasses(attrs.class)); + const onVnodeBeforeMount = (vnode: VNode) => { + // Add a listener to tell Vue to update the v-model + if (vnode.el) { + const eventsNames = Array.isArray(modelUpdateEvent) ? modelUpdateEvent : [modelUpdateEvent]; + eventsNames.forEach((eventName: string) => { + vnode.el.addEventListener(eventName.toLowerCase(), (e: Event) => { + modelPropValue = (e?.target as any)[modelProp]; + emit(UPDATE_VALUE_EVENT, modelPropValue); + + /** + * We need to emit the change event here + * rather than on the web component to ensure + * that any v-model bindings have been updated. + * Otherwise, the developer will listen on the + * native web component, but the v-model will + * not have been updated yet. + */ + if (externalModelUpdateEvent) { + emit(externalModelUpdateEvent, e); + } + }); + }); + } + }; + + const currentInstance = getCurrentInstance(); + const hasRouter = currentInstance?.appContext?.provides[NAV_MANAGER]; + const navManager: NavManager | undefined = hasRouter ? inject(NAV_MANAGER) : undefined; + const handleRouterLink = (ev: Event) => { + const { routerLink } = props; + if (routerLink === EMPTY_PROP) return; + + if (navManager !== undefined) { + let navigationPayload: any = { event: ev }; + for (const key in props) { + const value = props[key]; + if (props.hasOwnProperty(key) && key.startsWith(ROUTER_PROP_PREFIX) && value !== EMPTY_PROP) { + navigationPayload[key] = value; + } + } + + navManager.navigate(navigationPayload); + } else { + console.warn('Tried to navigate, but no router was found. Make sure you have mounted Vue Router.'); + } + } + + return () => { + modelPropValue = props[modelProp]; + + getComponentClasses(attrs.class).forEach(value => { + classes.add(value); + }); + + const oldClick = props.onClick; + const handleClick = (ev: Event) => { + if (oldClick !== undefined) { + oldClick(ev); + } + if (!ev.defaultPrevented) { + handleRouterLink(ev); + } + } + + let propsToAdd: any = { + ref: containerRef, + class: getElementClasses(containerRef, classes), + onClick: handleClick, + onVnodeBeforeMount: (modelUpdateEvent) ? onVnodeBeforeMount : undefined + }; + + /** + * We can use Object.entries here + * to avoid the hasOwnProperty check, + * but that would require 2 iterations + * where as this only requires 1. + */ + for (const key in props) { + const value = props[key]; + if (props.hasOwnProperty(key) && value !== EMPTY_PROP) { + propsToAdd[key] = value; + } + } + + if (modelProp) { + /** + * If form value property was set using v-model + * then we should use that value. + * Otherwise, check to see if form value property + * was set as a static value (i.e. no v-model). + */ + if (props[MODEL_VALUE] !== EMPTY_PROP) { + propsToAdd = { + ...propsToAdd, + [modelProp]: props[MODEL_VALUE] + } + } else if (modelPropValue !== EMPTY_PROP) { + propsToAdd = { + ...propsToAdd, + [modelProp]: modelPropValue + } + } + } + + return h(name, propsToAdd, slots.default && slots.default()); + } + }); + + Container.displayName = name; + + Container.props = { + [ROUTER_LINK_VALUE]: DEFAULT_EMPTY_PROP + }; + + componentProps.forEach(componentProp => { + Container.props[componentProp] = DEFAULT_EMPTY_PROP; + }); + + if (modelProp) { + Container.props[MODEL_VALUE] = DEFAULT_EMPTY_PROP; + Container.emits = [UPDATE_VALUE_EVENT, externalModelUpdateEvent]; + } + + return Container; +}; diff --git a/packages/elements-vue/tsconfig.json b/packages/elements-vue/tsconfig.json new file mode 100644 index 0000000000..f931fbf4e9 --- /dev/null +++ b/packages/elements-vue/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "allowUnreachableCode": false, + "allowSyntheticDefaultImports": true, + "declaration": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "lib": ["dom", "es2020"], + "module": "esnext", + "moduleResolution": "node", + "noImplicitAny": true, + "noImplicitReturns": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": "dist", + "declarationDir": "dist/types", + "removeComments": false, + "sourceMap": true, + "jsx": "react", + "target": "es2017", + "typeRoots": [ + "node_modules/@types" + ] + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["./__tests__/**", "node_modules", "setupTests.ts"], + "compileOnSave": false, + "buildOnSave": false +} diff --git a/packages/elements/package.json b/packages/elements/package.json index 7cf4055e15..571be53c32 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -94,6 +94,7 @@ }, "devDependencies": { "@stencil/angular-output-target": "^0.4.0", + "@stencil/vue-output-target": "^0.6.0", "@stencil/eslint-plugin": "^0.4.0", "@stencil/sass": "^1.5.2", "@types/classnames": "^2.2.6", diff --git a/packages/elements/src/components/ino-table/_table-row.scss b/packages/elements/src/components/ino-table/_table-row.scss index c1aef91009..2b1df9bdeb 100644 --- a/packages/elements/src/components/ino-table/_table-row.scss +++ b/packages/elements/src/components/ino-table/_table-row.scss @@ -1,11 +1,10 @@ @use 'base/theme'; $row-active-color: theme.color(secondary); -$row-hover-border-color: #D4DDEA; // TODO: Move color -$row-alt-background-color: #F6F8FB; // TODO: Move color +$row-hover-border-color: #d4ddea; // TODO: Move color +$row-alt-background-color: #f6f8fb; // TODO: Move color $row-alt-hover-background-color: $row-alt-background-color; - @mixin core-styles() { tr { border: none; @@ -23,14 +22,22 @@ $row-alt-hover-background-color: $row-alt-background-color; @mixin active-row() { .ino-table__row--active { - td, td:first-child, td:last-child, - th, th:first-child, th:last-child { + td, + td:first-child, + td:last-child, + th, + th:first-child, + th:last-child { border-color: rgba($row-active-color, 0.64); } &:hover { - td, td:first-child, td:last-child, - th, th:first-child, th:last-child { + td, + td:first-child, + td:last-child, + th, + th:first-child, + th:last-child { border-color: $row-active-color !important; } } @@ -44,10 +51,14 @@ $row-alt-hover-background-color: $row-alt-background-color; background-color: $row-alt-hover-background-color; } - td, td:first-child, td:last-child, - th, th:first-child, th:last-child { + td, + td:first-child, + td:last-child, + th, + th:first-child, + th:last-child { border-color: $row-hover-border-color; } } } -} \ No newline at end of file +} diff --git a/packages/elements/stencil.config.ts b/packages/elements/stencil.config.ts index 06796b58f5..4314853f23 100644 --- a/packages/elements/stencil.config.ts +++ b/packages/elements/stencil.config.ts @@ -1,8 +1,9 @@ import { Config } from '@stencil/core'; import { sass } from '@stencil/sass'; import { angularOutputTarget } from '@stencil/angular-output-target'; +import { vueOutputTarget } from "@stencil/vue-output-target"; -const angularDiretivesPath = '../elements-angular/elements/src/directives'; +const angularDirectivesPath = '../elements-angular/elements/src/directives'; export const config: Config = { buildEs5: false, @@ -32,9 +33,37 @@ export const config: Config = { }, angularOutputTarget({ componentCorePackage: '@inovex.de/elements', - directivesProxyFile: `${angularDiretivesPath}/proxies.ts`, - directivesUtilsFile: angularDiretivesPath, - directivesArrayFile: `${angularDiretivesPath}/proxies-list.ts`, + directivesProxyFile: `${angularDirectivesPath}/proxies.ts`, + directivesUtilsFile: angularDirectivesPath, + directivesArrayFile: `${angularDirectivesPath}/proxies-list.ts`, + }), + vueOutputTarget({ + componentCorePackage: '@inovex.de/elements', + proxiesFile: '../elements-vue/src/proxies.ts', + includeDefineCustomElements: false, + componentModels: [ + { + elements: [ + 'ino-checkbox', 'ino-radio', + 'ino-switch', 'ino-segment-button', + 'ino-control-item' + ], + targetAttr: 'checked', + event: 'v-checked-change', + externalEvent: 'checkedChange' + }, + { + elements: [ + 'ino-autocomplete', 'ino-datepicker', + 'ino-input-file', 'ino-input', + 'ino-range', 'ino-select', + 'ino-textarea' + ], + targetAttr: 'value', + event: 'v-value-change', + externalEvent: 'valueChange' + } + ], }), ], plugins: [ diff --git a/packages/storybook/elements-stencil-docs.json b/packages/storybook/elements-stencil-docs.json index 6b60c8177d..c121d71c7a 100644 --- a/packages/storybook/elements-stencil-docs.json +++ b/packages/storybook/elements-stencil-docs.json @@ -8603,4 +8603,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/storybook/src/stories/docs/framework-integration/vue-instructions.stories.mdx b/packages/storybook/src/stories/docs/framework-integration/vue-instructions.stories.mdx index 8f1ca1f911..d9a5e5858a 100644 --- a/packages/storybook/src/stories/docs/framework-integration/vue-instructions.stories.mdx +++ b/packages/storybook/src/stories/docs/framework-integration/vue-instructions.stories.mdx @@ -3,20 +3,74 @@ import { Meta } from "@storybook/addon-docs"; # Integrate with Vue.js (as Web Components) - -> We set up a demo project with Vue.js to show you how to integrate the components into a newly generated Vue.js +> We set up a demo project with Vue.js (v3) to show you how to integrate the components into a newly generated Vue.js > project. Scroll down to see the Stackblitz. > > These instructions are based on `vue@2.6.11` and [`create-react-app@4.2.3`](https://cli.vuejs.org/). -## 0) Prepare your Project +## Vue.js 3 -Before using `@inovex.de/elements`, you should make sure that your current setup works and boots properly. +Please follow these steps for integration into Vue.js(>= 3.0.0): + +### 0) Prepare your Project +Before using `@inovex.de/elements-vue`, you should make sure that your current setup works and boots properly. If this is the case, proceed to the next step. -## 1) Install `@inovex.de/elements` +### 1) Install `@inovex.de/elements-vue` +Add the package `@inovex.de/elements-vue` to your project using **npm**: + +```sh +$ npm install @inovex.de/elements-vue --save +``` + +or **yarn**: + +```sh +$ yarn add @inovex.de/elements-vue +``` + +### 2) Prepare the Project to use icons (optional) +Before you start using the elements icons, you need to prepare the project. +Open `src/main.js` and add the following code snippet somewhere on the first lines to import the icons. + +```js +// src/main.js +import { addIcons } from '@inovex.de/elements/dist/collection/util/icons'; +import { ICON_PATHS } from '@inovex.de/elements/dist/inovex-elements/ino-icon/index.esm.js'; + +addIcons(ICON_PATHS); // only needed if you want to use our icons +``` + +### 3) Use the Components +As the integration is now complete, you can use the components in your project in the same way you would use any other Vue.js component. -> Hint: We do not provide an integration package for Vue.js as we do for Angular and React. +```js +// src/App.vue +import { InoButton } from "@inovex.de/elements-vue"; + +export default { + name: 'ExampleApp', + components: { + InoButton, + }, + data: () => ({ + myData: [], + }), + methods: { + foo() {} + } +} +``` + +## Vue.js 2 +Please follow these steps for integration into Vue.js(<= 2.x.x): + +### 0) Prepare your Project +Before using `@inovex.de/elements`, you should make sure that your current setup works and boots properly. +If this is the case, proceed to the next step. + +### 1) Install `@inovex.de/elements` +> Hint: We do not provide an integration package for Vue.js(<= 2.x.x) as we do for Angular and React. > Vue.js works out-of-the box with Web Components as Vue.js respects the DOM API standards. Add the package `@inovex.de/elements` to your project using **npm**: @@ -32,7 +86,6 @@ $ yarn add @inovex.de/elements ``` ### 2) Prepare the Project - Before you start using the components, you need to prepare the project. Open `src/main.js` and add the following code snippet somewhere on the first lines, to... @@ -64,7 +117,7 @@ applyPolyfills().then(() => { ``` ### 3) Use the Components - You can now use the components in your Vue.js project in the same way you would use any native HTML element. +## Simple todo app To help you to get started, we created a [simple todo app](https://codesandbox.io/s/github/inovex/elements-example-vue) for you to play around with. diff --git a/scripts/publishYalc.js b/scripts/publishYalc.js index 81e7a4f97c..7535b011b6 100644 --- a/scripts/publishYalc.js +++ b/scripts/publishYalc.js @@ -11,6 +11,7 @@ const questions = [ choices: [ { title: 'Angular', value: 'angular', selected: true }, { title: 'React', value: 'react', selected: true }, + { title: 'Vue', value: 'vue', selected: true }, ], }, { @@ -27,6 +28,12 @@ function publishReact() { ); } +function publishVue() { + shell.exec( + 'lerna exec --scope=@inovex.de/elements-vue -- yalc publish --no-sig --push' + ); +} + function publishAngular() { switch (process.platform) { case 'win32': @@ -88,7 +95,7 @@ async function main() { // build packages (angular-builder for angular, else target) shell.exec( `lerna exec --scope=@inovex.de/elements-${ - target == 'angular' ? 'angular-builder' : target + target === 'angular' ? 'angular-builder' : target } -- yarn build` ); }); @@ -100,7 +107,9 @@ async function main() { if (targets.includes('react')) { publishReact(); } - + if (targets.includes('vue')) { + publishVue(); + } // Clean up targets.forEach((target) => { shell.exec( diff --git a/yarn.lock b/yarn.lock index c734ecb3b4..96c7d02fc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -480,6 +480,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.17.3": + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" + integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@7.14.5", "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -1398,6 +1407,11 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314" integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ== +"@babel/parser@^7.16.4", "@babel/parser@^7.17.3", "@babel/parser@^7.7.0": + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" + integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== + "@babel/parser@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" @@ -3359,6 +3373,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.7.0": + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": version "7.10.2" resolved "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" @@ -3409,6 +3439,14 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.17.0", "@babel/types@^7.7.0": + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@babel/types@^7.3.3": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" @@ -6286,7 +6324,7 @@ resolved "https://registry.npmjs.org/@stencil/angular-output-target/-/angular-output-target-0.4.0.tgz#6724ed805d50e802f58212d74a71caf442e0b569" integrity sha512-zauaj0za46IWoPgv2IanDp3tiljwDRDNk4jB7WII6KeL66dkk7ffeqYZ0CgySTU5W2FjnKR6JEKbAnwUxjGIsA== -"@stencil/core@2.14.0": +"@stencil/core@2.14.0", "@stencil/core@^2.14.0": version "2.14.0" resolved "https://registry.npmjs.org/@stencil/core/-/core-2.14.0.tgz#4878e56b1989bfd77d73de6e951c3721e0e32052" integrity sha512-tiGFK9VADoHJvAZoTHN/c6YBaTzB5+V3aTn7CzjPxIqryjh3jCUlMP4VDvzkrnVWjhj8Fa82zMWdePgr/xoyOw== @@ -6309,6 +6347,11 @@ resolved "https://registry.npmjs.org/@stencil/sass/-/sass-1.5.2.tgz#861dffe90a8d911b6b2af4a36d8928b5264a8646" integrity sha512-nJ93pUSylsGsMX0eLmhxh1oEljcUjj5mYjhB9ziCdoaydAdjukrUoqDCC7tdVbOcBo2hKptQyWqCtETnBGYsXQ== +"@stencil/vue-output-target@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.6.0.tgz#beb1f6274168f35a928f19fe2198db039f27ff02" + integrity sha512-UxI0RTgz3AfhOePbgK3CNcX7uLVxDrdkpSCJoIyr8EjSrW5HkfraZ/ukIzuPDJDDxtYRRevY7It+qOhfn0B6aA== + "@storybook/addon-actions@6.4.9", "@storybook/addon-actions@^6.4.9": version "6.4.9" resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.9.tgz#1d4e8c00ad304efe6722043dac759f4716b515ee" @@ -7484,7 +7527,7 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@*": +"@types/bonjour@*", "@types/bonjour@^3.5.9": version "3.5.10" resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== @@ -7513,7 +7556,7 @@ resolved "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== -"@types/connect-history-api-fallback@*": +"@types/connect-history-api-fallback@*", "@types/connect-history-api-fallback@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== @@ -7608,7 +7651,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*": +"@types/express@*", "@types/express@^4.17.13": version "4.17.13" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -8060,7 +8103,7 @@ resolved "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== -"@types/serve-index@*": +"@types/serve-index@*", "@types/serve-index@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== @@ -8075,6 +8118,13 @@ "@types/mime" "^1" "@types/node" "*" +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@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#0078836063ffaf17412349bba364087e0ac02ec9" @@ -8178,6 +8228,13 @@ "@types/webpack-sources" "*" source-map "^0.6.0" +"@types/ws@^8.2.2": + version "8.5.2" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz#77e0c2e360e9579da930ffcfa53c5975ea3bdd26" + integrity sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -8381,6 +8438,28 @@ core-js-compat "^3.8.3" semver "^7.3.4" +"@vue/babel-preset-app@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.1.tgz#37b00fae57b55218b53a164910f201e531b54e5c" + integrity sha512-6G7Cf4qm3FBJNWsZYWWcyK5/eVutkHtYxJFPKP1O09efMnAKPSzVljBT+MyJ/OMUGTdCuw2zLyc9iaEhpZv+MQ== + dependencies: + "@babel/core" "^7.12.16" + "@babel/helper-compilation-targets" "^7.12.16" + "@babel/helper-module-imports" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-decorators" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/plugin-transform-runtime" "^7.12.15" + "@babel/preset-env" "^7.12.16" + "@babel/runtime" "^7.12.13" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.1.2" + babel-plugin-dynamic-import-node "^2.3.3" + core-js "^3.8.3" + core-js-compat "^3.8.3" + semver "^7.3.4" + "@vue/babel-preset-jsx@^1.1.2": version "1.2.4" resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" @@ -8449,6 +8528,11 @@ resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-5.0.0-rc.1.tgz#84a60b305614eda3d00e959cfb9780d713e352f9" integrity sha512-pJ8DxDlFiM73FaNlpKqOi3haG15c/6jPLiFZKIGJDoMxLLufSxEZ8aSfvbFRjqwGy/o3I4jzg086Yy+3ZhdG1g== +"@vue/cli-overlay@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.1.tgz#3e8b7a80fbb1693e5a15a791e435a3bece75b6b9" + integrity sha512-8cLpHoQVYHoI4EjUG4+gbuUI9xxhkP5Vz/o/WLAkAAs//+1vE/A5AjCdLeQYGR9X6T4+b/kci2ArIpSSsRi8/Q== + "@vue/cli-plugin-babel@~5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.0-rc.1.tgz#9fd1f7e71240ec15c921e7680558c23920d04bd0" @@ -8461,6 +8545,18 @@ thread-loader "^3.0.0" webpack "^5.54.0" +"@vue/cli-plugin-babel@~5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.1.tgz#f45ece698482f2382a2c3e9a5ef0cc2132317302" + integrity sha512-OVAbxmnlSHBk2I01q4Fs69rrqm43KxXmaltzXE0HT0KGT2UbwXZOLfdlf2CIun3du9JhPP0ElA33WGkXGEP6OQ== + dependencies: + "@babel/core" "^7.12.16" + "@vue/babel-preset-app" "^5.0.1" + "@vue/cli-shared-utils" "^5.0.1" + babel-loader "^8.2.2" + thread-loader "^3.0.0" + webpack "^5.54.0" + "@vue/cli-plugin-eslint@~5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.0-rc.1.tgz#d6525834d54249ed5df5ba55614eeea3fa836812" @@ -8472,6 +8568,17 @@ webpack "^5.54.0" yorkie "^2.0.0" +"@vue/cli-plugin-eslint@~5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.1.tgz#5944eafb84bb5076d6280432edb7d674d0f86962" + integrity sha512-ZGxIAT4b9ppMbePJrsZA6e5882n7JIQgji8LLyYSMuf0+GTsEjUDz01nRmAD7PW+Gpf8+B5oA2tU+S3E5l6/WA== + dependencies: + "@vue/cli-shared-utils" "^5.0.1" + eslint-webpack-plugin "^3.1.0" + globby "^11.0.2" + webpack "^5.54.0" + yorkie "^2.0.0" + "@vue/cli-plugin-router@^5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.0-rc.1.tgz#9452cc4bade70bd243f7ecbfdf7c80487293af14" @@ -8479,11 +8586,23 @@ dependencies: "@vue/cli-shared-utils" "^5.0.0-rc.1" +"@vue/cli-plugin-router@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.1.tgz#f512a2c882d3eb2c15ba387bb1e598be625ea2c4" + integrity sha512-Eu56AQUEK0uULgIQotZwi5eijYNBS3+znMc0u/kaI1puW3+f/qP3YCtffp5CeVcG2Kxwrx66XBI6PMHg8hPdmA== + dependencies: + "@vue/cli-shared-utils" "^5.0.1" + "@vue/cli-plugin-vuex@^5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.0-rc.1.tgz#2f4f04ae831ebca688acea5531658d1236baed23" integrity sha512-ShfPIvuD+AFUtUcTw5okLUnBy8o4NrC0ICPpD7z+KG4gbfWzZMmT2TAkjqO9pp21cI+bYzigsBZ/FoXiU5+h7Q== +"@vue/cli-plugin-vuex@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.1.tgz#7d277989e896db88588b4a0875314fe6576bf243" + integrity sha512-5J/n+Ht4r2eVuncwCXcZPHzYCz/2haktle4WcggWiKeg3jSQVUJbjviPBs6sOo3y/LG3CEfZMP9bPJjVDbexpQ== + "@vue/cli-service@~5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-5.0.0-rc.1.tgz#a0e659d007acf6e162d8ab42b590386ec9c1fcb9" @@ -8547,6 +8666,67 @@ webpack-virtual-modules "^0.4.2" whatwg-fetch "^3.6.2" +"@vue/cli-service@~5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.1.tgz#72abd40acb75ca7a6efcb06b502d2cdb90f2c745" + integrity sha512-lhTW1d8waZv1VaRSvhE5pWWfkdmAgRTRSluDfyxkehZHMAWi//rd7a9zppN3k9Zr4X3oYVii+u7wR/RcTlr9cQ== + dependencies: + "@babel/helper-compilation-targets" "^7.12.16" + "@soda/friendly-errors-webpack-plugin" "^1.8.0" + "@soda/get-current-script" "^1.0.2" + "@types/minimist" "^1.2.0" + "@vue/cli-overlay" "^5.0.1" + "@vue/cli-plugin-router" "^5.0.1" + "@vue/cli-plugin-vuex" "^5.0.1" + "@vue/cli-shared-utils" "^5.0.1" + "@vue/component-compiler-utils" "^3.3.0" + "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" + "@vue/web-component-wrapper" "^1.3.0" + acorn "^8.0.5" + acorn-walk "^8.0.2" + address "^1.1.2" + autoprefixer "^10.2.4" + browserslist "^4.16.3" + case-sensitive-paths-webpack-plugin "^2.3.0" + cli-highlight "^2.1.10" + clipboardy "^2.3.0" + cliui "^7.0.4" + copy-webpack-plugin "^9.0.1" + css-loader "^6.5.0" + css-minimizer-webpack-plugin "^3.0.2" + cssnano "^5.0.0" + debug "^4.1.1" + default-gateway "^6.0.3" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + fs-extra "^9.1.0" + globby "^11.0.2" + hash-sum "^2.0.0" + html-webpack-plugin "^5.1.0" + is-file-esm "^1.0.0" + launch-editor-middleware "^2.2.1" + lodash.defaultsdeep "^4.6.1" + lodash.mapvalues "^4.6.0" + mini-css-extract-plugin "^2.5.3" + minimist "^1.2.5" + module-alias "^2.2.2" + portfinder "^1.0.26" + postcss "^8.2.6" + postcss-loader "^6.1.1" + progress-webpack-plugin "^1.0.12" + ssri "^8.0.1" + terser-webpack-plugin "^5.1.1" + thread-loader "^3.0.0" + vue-loader "^17.0.0" + vue-style-loader "^4.1.3" + webpack "^5.54.0" + webpack-bundle-analyzer "^4.4.0" + webpack-chain "^6.5.1" + webpack-dev-server "^4.7.3" + webpack-merge "^5.7.3" + webpack-virtual-modules "^0.4.2" + whatwg-fetch "^3.6.2" + "@vue/cli-shared-utils@^5.0.0-rc.1": version "5.0.0-rc.1" resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.0-rc.1.tgz#0587c663775e666227d896ebbb365ea9909047d8" @@ -8565,6 +8745,66 @@ semver "^7.3.4" strip-ansi "^6.0.0" +"@vue/cli-shared-utils@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.1.tgz#9e33cacefad427bbf8939f953204373ad107fbee" + integrity sha512-oL164c3yDhdLHgiFvSkXuP7z0eEY8gqTYzHHbvQJCIBtRZ/0H9Q7xICpAeMZ63lJvS2+fA5bQfv+kPII/kcjmQ== + dependencies: + chalk "^4.1.2" + execa "^1.0.0" + joi "^17.4.0" + launch-editor "^2.2.1" + lru-cache "^6.0.0" + node-fetch "^2.6.7" + node-ipc "^9.1.1" + open "^8.0.2" + ora "^5.3.0" + read-pkg "^5.1.1" + semver "^7.3.4" + strip-ansi "^6.0.0" + +"@vue/compiler-core@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz#d38f06c2cf845742403b523ab4596a3fda152e89" + integrity sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e" + integrity sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg== + dependencies: + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/compiler-sfc@3.2.31", "@vue/compiler-sfc@^3.0.11": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f" + integrity sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-ssr" "3.2.31" + "@vue/reactivity-transform" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz#4fa00f486c9c4580b40a4177871ebbd650ecb99c" + integrity sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw== + dependencies: + "@vue/compiler-dom" "3.2.31" + "@vue/shared" "3.2.31" + "@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" @@ -8581,6 +8821,59 @@ optionalDependencies: prettier "^1.18.2 || ^2.0.0" +"@vue/devtools-api@^6.0.0": + version "6.0.12" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.12.tgz#7b57cce215ae9f37a86984633b3aa3d595aa5b46" + integrity sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw== + +"@vue/reactivity-transform@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz#0f5b25c24e70edab2b613d5305c465b50fc00911" + integrity sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz#fc90aa2cdf695418b79e534783aca90d63a46bbd" + integrity sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw== + dependencies: + "@vue/shared" "3.2.31" + +"@vue/runtime-core@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz#9d284c382f5f981b7a7b5971052a1dc4ef39ac7a" + integrity sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA== + dependencies: + "@vue/reactivity" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/runtime-dom@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz#79ce01817cb3caf2c9d923f669b738d2d7953eff" + integrity sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g== + dependencies: + "@vue/runtime-core" "3.2.31" + "@vue/shared" "3.2.31" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz#201e9d6ce735847d5989403af81ef80960da7141" + integrity sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg== + dependencies: + "@vue/compiler-ssr" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/shared@3.2.31": + version "3.2.31" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e" + integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ== + "@vue/vue-loader-v15@npm:vue-loader@^15.9.7": version "15.9.8" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.8.tgz#4b0f602afaf66a996be1e534fb9609dc4ab10e61" @@ -9060,6 +9353,11 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-jsx@^5.2.0: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -9829,6 +10127,18 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" +babel-eslint@^10.0.3: + version "10.1.0" + resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-jest@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" @@ -10987,6 +11297,21 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -11900,6 +12225,11 @@ core-js@^3.0.4, core-js@^3.2.1, core-js@^3.6.5: resolved "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== +core-js@^3.21.1: + version "3.21.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" + integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== + core-js@^3.8.2: version "3.12.1" resolved "https://registry.npmjs.org/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" @@ -12492,6 +12822,11 @@ csstype@^2.2.0, csstype@^2.5.7: resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== +csstype@^2.6.8: + version "2.6.19" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" + integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== + csstype@^3.0.2: version "3.0.10" resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" @@ -13710,6 +14045,16 @@ eslint-plugin-react@^7.22.0: resolve "^1.18.1" string.prototype.matchall "^4.0.2" +eslint-plugin-vue@^7.9.0: + version "7.20.0" + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253" + integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw== + dependencies: + eslint-utils "^2.1.0" + natural-compare "^1.4.0" + semver "^6.3.0" + vue-eslint-parser "^7.10.0" + eslint-plugin-vue@^8.0.3: version "8.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.2.0.tgz#b404bc10e3f43b2b7aad4ebb3b38090a58040202" @@ -13758,7 +14103,7 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -13832,7 +14177,7 @@ eslint@^7.19.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^7.32.0: +eslint@^7.26.0, eslint@^7.32.0: version "7.32.0" resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== @@ -13878,6 +14223,15 @@ eslint@^7.32.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +espree@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -13954,6 +14308,11 @@ estree-walker@^2.0.1: resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -19304,6 +19663,13 @@ memfs@^3.1.2, memfs@^3.2.2: dependencies: fs-monkey "1.0.3" +memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + memoizerific@^1.11.3: version "1.11.3" resolved "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" @@ -19592,6 +19958,13 @@ mini-css-extract-plugin@^2.4.3: dependencies: schema-utils "^4.0.0" +mini-css-extract-plugin@^2.5.3: + version "2.6.0" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -19857,6 +20230,11 @@ nanoid@^3.1.23, nanoid@^3.1.30: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -19975,7 +20353,7 @@ node-fetch@2.6.1: resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.1: +node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -19987,6 +20365,11 @@ node-forge@^0.10.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" + integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== + node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -22480,6 +22863,15 @@ postcss@^7.0.17, postcss@^7.0.35, postcss@^7.0.36: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.1.10: + version "8.4.7" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz#f99862069ec4541de386bf57f5660a6c7a0875a8" + integrity sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.2.6, postcss@^8.3.5: version "8.4.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" @@ -24334,6 +24726,13 @@ selfsigned@^1.10.11, selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" +selfsigned@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" + integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== + dependencies: + node-forge "^1.2.0" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -24795,7 +25194,7 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -26347,6 +26746,11 @@ typescript@^4.1.6: resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typescript@^4.2.4: + version "4.6.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== + typescript@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" @@ -26851,6 +27255,19 @@ void-elements@^2.0.0: resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +vue-eslint-parser@^7.10.0: + version "7.11.0" + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" + integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg== + dependencies: + debug "^4.1.1" + eslint-scope "^5.1.1" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^6.3.0" + vue-eslint-parser@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz#25e08b20a414551531f3e19f999902e1ecf45f13" @@ -26878,11 +27295,27 @@ vue-loader@^16.8.2: hash-sum "^2.0.0" loader-utils "^2.0.0" +vue-loader@^17.0.0: + version "17.0.0" + resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz#2eaa80aab125b19f00faa794b5bd867b17f85acb" + integrity sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg== + dependencies: + chalk "^4.1.0" + hash-sum "^2.0.0" + loader-utils "^2.0.0" + vue-router@^3.2.0: version "3.5.3" resolved "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz#041048053e336829d05dafacf6a8fb669a2e7999" integrity sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg== +vue-router@^4.0.0: + version "4.0.13" + resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.0.13.tgz#47f06e2f8ff6120bfff3c27ade1356cc9de7d870" + integrity sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw== + dependencies: + "@vue/devtools-api" "^6.0.0" + vue-style-loader@^4.1.0, vue-style-loader@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" @@ -26909,6 +27342,17 @@ vue@^2.6.14: resolved "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== +vue@^3.0.0, vue@^3.2.31: + version "3.2.31" + resolved "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz#e0c49924335e9f188352816788a4cca10f817ce6" + integrity sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw== + dependencies: + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-sfc" "3.2.31" + "@vue/runtime-dom" "3.2.31" + "@vue/server-renderer" "3.2.31" + "@vue/shared" "3.2.31" + w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -27120,6 +27564,17 @@ webpack-dev-middleware@^5.2.1: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + dependencies: + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + webpack-dev-server@3.11.2: version "3.11.2" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" @@ -27190,6 +27645,42 @@ webpack-dev-server@^4.1.0: webpack-dev-middleware "^5.2.1" ws "^8.1.0" +webpack-dev-server@^4.7.3: + version "4.7.4" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945" + integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.2.2" + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^4.0.0" + selfsigned "^2.0.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + webpack-filter-warnings-plugin@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" @@ -27674,6 +28165,11 @@ ws@^8.1.0, ws@^8.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" integrity sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ== +ws@^8.4.2: + version "8.5.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@~8.2.3: version "8.2.3" resolved "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"