Bump @vue/eslint-config-typescript from 4.0.0 to 5.0.2 (#141)

* Bump @vue/eslint-config-typescript from 4.0.0 to 5.0.2

Bumps [@vue/eslint-config-typescript](https://github.com/vuejs/eslint-config-typescript) from 4.0.0 to 5.0.2.
- [Release notes](https://github.com/vuejs/eslint-config-typescript/releases)
- [Commits](https://github.com/vuejs/eslint-config-typescript/commits/v5.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Update eslintrc to match major upgrade of typescript-eslint

* Fix linter warnings and tests

* Fix tests for real this time

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
This commit is contained in:
dependabot-preview[bot]
2020-03-03 16:06:46 -05:00
committed by GitHub
parent be1d2cf4f8
commit dba5329d31
66 changed files with 178 additions and 312 deletions

View File

@@ -3,20 +3,33 @@ module.exports = {
env: {
node: true
},
extends: ['eslint:recommended', 'plugin:vue/essential', '@vue/prettier', '@vue/typescript'],
extends: [
'plugin:vue/essential',
'@vue/typescript/recommended',
'@vue/prettier',
'@vue/prettier/@typescript-eslint'
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'prettier/prettier': ['error', { singleQuote: true }]
'prettier/prettier': ['error', { singleQuote: true }],
'@typescript-eslint/camelcase': null,
'@typescript-eslint/no-use-before-define': null,
'@typescript-eslint/ban-ts-ignore': null
},
parserOptions: {
parser: '@typescript-eslint/parser'
},
overrides: [
{
files: ['**/*.test.{js,ts}?(x)'],
files: ['**/*.test.{js,ts}?(x)', '**/*.story.{js,ts}?(x)'],
env: {
jest: true
},
rules: {
'@typescript-eslint/no-explicit-any': null,
'@typescript-eslint/no-empty-function': null,
'@typescript-eslint/no-non-null-assertion': null
}
}
]

View File

@@ -56,7 +56,7 @@
"@vue/cli-plugin-vuex": "^4.2.3",
"@vue/cli-service": "^4.1.0",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^4.0.0",
"@vue/eslint-config-typescript": "^5.0.2",
"@vue/test-utils": "^1.0.0-beta.30",
"autoprefixer": "^9.7.4",
"babel-loader": "^8.0.6",

View File

@@ -1,9 +1,26 @@
import Vue from 'vue';
import VueCompositionAPI from '@vue/composition-api';
import { onRequest, onResponse, onError, getRootPath } from './api';
import { onRequest, onResponse, onError, getRootPath, Error } from './api';
import * as auth from '@/auth';
import { useRequestsStore } from '@/stores/requests';
const defaultError: Error = {
config: {},
isAxiosError: false,
toJSON: () => ({}),
name: 'error',
message: '',
response: {
data: null,
status: 200,
statusText: 'OK',
headers: {},
config: {
id: 'abc'
}
}
};
describe('API', () => {
beforeAll(() => {
globalThis.window = Object.create(window);
@@ -56,80 +73,39 @@ describe('API', () => {
const spy = jest.spyOn(store, 'endRequest');
try {
await onError({
response: {
config: {
id: 'abc'
}
}
...defaultError
});
} catch (error) {
expect(error).toEqual({ response: { config: { id: 'abc' } } });
}
} catch {}
expect(spy).toHaveBeenCalledWith('abc');
});
it('Passes the error on to the next catch handler on unrelated 401 errors', async () => {
const store = useRequestsStore({});
try {
await onError({
response: {
status: 401,
config: {
id: 'abc'
const error = {
...defaultError,
response: {
...defaultError.response,
status: 401,
config: {
id: 'abc'
},
data: {
error: {
code: -5
}
}
});
} catch (error) {
expect(error).toEqual({ response: { status: 401, config: { id: 'abc' } } });
}
}
};
try {
await onError({
response: {
status: 500,
config: {
id: 'abc'
}
}
});
} catch (error) {
expect(error).toEqual({ response: { status: 500, config: { id: 'abc' } } });
}
try {
await onError({
response: {
status: 401,
config: {
id: 'abc'
},
data: {
error: {
code: 5
}
}
}
});
} catch (error) {
expect(error).toEqual({
response: {
status: 401,
config: { id: 'abc' },
data: {
error: {
code: 5
}
}
}
});
}
expect(onError(error)).rejects.toEqual(error);
});
it('Checks the auth status on 401+3 errors', async () => {
try {
await onError({
...defaultError,
response: {
...defaultError.response,
config: {
id: 'abc'
},
@@ -151,7 +127,9 @@ describe('API', () => {
try {
await onError({
...defaultError,
response: {
...defaultError.response,
config: {
id: 'abc'
},
@@ -175,7 +153,9 @@ describe('API', () => {
try {
await onError({
...defaultError,
response: {
...defaultError.response,
config: {
id: 'abc'
},

View File

@@ -1,7 +1,6 @@
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { useRequestsStore } from '@/stores/requests';
import { LogoutReason, logout, checkAuth } from '@/auth';
import useProjectsStore from './stores/projects';
const api = axios.create({
baseURL: getRootPath()
@@ -15,6 +14,10 @@ interface Response extends AxiosResponse {
config: RequestConfig;
}
export interface Error extends AxiosError {
response: Response;
}
export const onRequest = (config: AxiosRequestConfig) => {
const requestsStore = useRequestsStore();
const id = requestsStore.startRequest();
@@ -34,7 +37,7 @@ export const onResponse = (response: AxiosResponse | Response) => {
return response;
};
export const onError = async (error: any) => {
export const onError = async (error: Error) => {
const requestsStore = useRequestsStore();
const id = (error.response.config as RequestConfig).id;
requestsStore.endRequest(id);
@@ -47,6 +50,7 @@ export const onError = async (error: any) => {
const status = error.response?.status;
/* istanbul ignore next */
const code = error.response?.data?.error?.code;
if (status === 401 && code === 3) {
const loggedIn = await checkAuth();

View File

@@ -4,9 +4,7 @@ import * as hydration from '@/hydrate';
import api from '@/api';
import { checkAuth, login, logout, LogoutReason } from './auth';
import { useProjectsStore } from '@/stores/projects/';
import { useRequestsStore } from '@/stores/requests/';
import router from '@/router';
import { eachMonthOfInterval } from 'date-fns';
jest.mock('@/api');
jest.mock('@/router');
@@ -84,7 +82,7 @@ describe('Auth', () => {
describe('logout', () => {
it('Does not do anything when there is no current project', async () => {
const projectsStore = useProjectsStore({});
useProjectsStore({});
await logout();
expect(hydration.dehydrate).not.toHaveBeenCalled();
});

View File

@@ -6,7 +6,6 @@ import {
color,
optionsKnob as options
} from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VAvatar from './v-avatar.vue';
import VIcon from '../v-icon/';

View File

@@ -5,8 +5,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '../../utils/parse-css-var';
import { defineComponent } from '@vue/composition-api';
import useSizeClass, { sizeProps } from '@/compositions/size-class';
export default defineComponent({

View File

@@ -1,4 +1,4 @@
import { withKnobs, text, boolean, number, optionsKnob as options } from '@storybook/addon-knobs';
import { withKnobs, text, boolean, number } from '@storybook/addon-knobs';
import Vue from 'vue';
import VBadge from './v-badge.vue';
import VIcon from '../v-icon/';

View File

@@ -10,7 +10,7 @@
</template>
<script lang="ts">
import { defineComponent, reactive, computed, Ref } from '@vue/composition-api';
import { defineComponent } from '@vue/composition-api';
export default defineComponent({
props: {

View File

@@ -1,5 +1,3 @@
import { array, optionsKnob as options } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import markdown from './v-breadcrumb.readme.md';
import VIcon from '../v-icon/';

View File

@@ -20,7 +20,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, PropType } from '@vue/composition-api';
import { defineComponent, PropType } from '@vue/composition-api';
interface Breadcrumb {
to: string;
@@ -36,11 +36,12 @@ export default defineComponent({
default: () => []
}
},
setup(props) {
setup() {
return {};
}
});
</script>
<style lang="scss" scoped>
.v-breadcrumb {
--v-breadcrumb-color: var(--foreground-color-secondary);

View File

@@ -19,9 +19,8 @@
</template>
<script lang="ts">
import { defineComponent, reactive, computed, Ref, PropType } from '@vue/composition-api';
import { defineComponent, computed, PropType } from '@vue/composition-api';
import { Location } from 'vue-router';
import parseCSSVar from '@/utils/parse-css-var';
import useSizeClass, { sizeProps } from '@/compositions/size-class';
export default defineComponent({

View File

@@ -1,11 +1,4 @@
import {
withKnobs,
text,
boolean,
number,
optionsKnob as options,
color
} from '@storybook/addon-knobs';
import { withKnobs, color } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VCheckbox from '../v-checkbox';

View File

@@ -17,7 +17,6 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
export default defineComponent({
model: {
@@ -68,7 +67,7 @@ export default defineComponent({
}
if (props.inputValue instanceof Array) {
let newValue = [...props.inputValue];
const newValue = [...props.inputValue];
if (isChecked.value === false) {
newValue.push(props.value);

View File

@@ -1,11 +1,4 @@
import {
withKnobs,
text,
boolean,
number,
color,
optionsKnob as options
} from '@storybook/addon-knobs';
import { withKnobs, text, boolean, color, optionsKnob as options } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VChip from './v-chip.vue';

View File

@@ -21,7 +21,6 @@
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
import useSizeClass, { sizeProps } from '@/compositions/size-class';
export default defineComponent({

View File

@@ -11,8 +11,7 @@
</template>
<script lang="ts">
import { defineComponent, reactive, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
import { defineComponent, computed } from '@vue/composition-api';
import CustomIconBox from './custom-icons/box.vue';
import useSizeClass, { sizeProps } from '@/compositions/size-class';

View File

@@ -1,5 +1,4 @@
import { withKnobs } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VInput from './v-input.vue';
import markdown from './v-input.readme.md';

View File

@@ -5,20 +5,8 @@
</template>
<script lang="ts">
import Vue, { VNode } from 'vue';
import {
defineComponent,
ref,
provide,
PropType,
computed,
Ref,
watch,
toRefs
} from '@vue/composition-api';
import { defineComponent, PropType, toRefs } from '@vue/composition-api';
import { useGroupableParent } from '@/compositions/groupable';
import arraysAreEqual from '@/utils/arrays-are-equal';
import { notEmpty } from '@/utils/is-empty';
export default defineComponent({
props: {

View File

@@ -5,7 +5,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, provide } from '@vue/composition-api';
import { defineComponent } from '@vue/composition-api';
import { useGroupable } from '@/compositions/groupable';
export default defineComponent({
@@ -15,7 +15,7 @@ export default defineComponent({
default: null
}
},
setup(props, context) {
setup(props) {
const { active, toggle } = useGroupable(props.value);
return { active, toggle };
}

View File

@@ -1,4 +1,4 @@
import { mount, createLocalVue, shallowMount } from '@vue/test-utils';
import { mount, createLocalVue } from '@vue/test-utils';
import VueCompositionAPI from '@vue/composition-api';
import VueRouter from 'vue-router';
import router from '@/router';

View File

@@ -1,13 +1,4 @@
import {
withKnobs,
text,
boolean,
number,
color,
select,
optionsKnob as options
} from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import { withKnobs, text, boolean } from '@storybook/addon-knobs';
import Vue from 'vue';
import VNotice from './v-notice.vue';
import VIcon from '../v-icon/';

View File

@@ -1,11 +1,4 @@
import {
withKnobs,
text,
boolean,
number,
optionsKnob as options,
color
} from '@storybook/addon-knobs';
import { withKnobs, text, boolean, number } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VOverlay from '../v-overlay';
@@ -71,8 +64,7 @@ export const withClick = () => ({
methods: {
click(event: MouseEvent) {
action('click')(event);
const self: any = this;
self.active = false;
(this as any).active = false;
}
},
template: `

View File

@@ -7,7 +7,6 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
export default defineComponent({
props: {

View File

@@ -19,7 +19,6 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
import useSizeClass, { sizeProps } from '@/compositions/size-class';
export default defineComponent({

View File

@@ -1,11 +1,4 @@
import {
withKnobs,
color,
optionsKnob as options,
number,
text,
boolean
} from '@storybook/addon-knobs';
import { withKnobs, color, number, boolean } from '@storybook/addon-knobs';
import Vue from 'vue';
import VProgressLinear from './v-progress-linear.vue';

View File

@@ -22,8 +22,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
import { defineComponent } from '@vue/composition-api';
export default defineComponent({
props: {

View File

@@ -1,15 +1,6 @@
import {
withKnobs,
text,
boolean,
number,
color,
optionsKnob as options
} from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import { withKnobs, text, color } from '@storybook/addon-knobs';
import Vue from 'vue';
import VSheet from './v-sheet.vue';
import VIcon from '../v-icon/';
import markdown from './v-sheet.readme.md';
import withPadding from '../../../.storybook/decorators/with-padding';

View File

@@ -5,7 +5,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import { defineComponent } from '@vue/composition-api';
export default defineComponent({
props: {},

View File

@@ -192,16 +192,14 @@ export const slots = () => ({
methods: {
onInput: action('input'),
onChange: action('change'),
clickMinus(event: MouseEvent) {
const self: any = this;
if (self.value > 5) {
self.value = self.value - 1;
clickMinus() {
if ((this as any).value > 5) {
(this as any).value = (this as any).value - 1;
}
},
clickPlus() {
const self: any = this;
if (self.value < 15) {
self.value = self.value + 1;
if ((this as any).value < 15) {
(this as any).value = (this as any).value + 1;
}
}
},

View File

@@ -33,7 +33,6 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
import { ChangeEvent } from 'react';
export default defineComponent({
@@ -63,7 +62,7 @@ export default defineComponent({
default: 50
}
},
setup(props, { emit, listeners }) {
setup(props, { emit }) {
const styles = computed(() => ({
'--_v-slider-percentage': ((props.value - props.min) / (props.max - props.min)) * 100
}));

View File

@@ -1,11 +1,4 @@
import {
withKnobs,
text,
boolean,
number,
optionsKnob as options,
color
} from '@storybook/addon-knobs';
import { withKnobs, color } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import Vue from 'vue';
import VSwitch from '../v-switch/';

View File

@@ -16,7 +16,6 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import parseCSSVar from '@/utils/parse-css-var';
export default defineComponent({
model: {
@@ -54,7 +53,7 @@ export default defineComponent({
function toggleInput(): void {
if (props.inputValue instanceof Array) {
let newValue = [...props.inputValue];
const newValue = [...props.inputValue];
if (isChecked.value === false) {
newValue.push(props.value);

View File

@@ -1,5 +1,5 @@
import VueCompositionAPI from '@vue/composition-api';
import { mount, createLocalVue, Wrapper, shallowMount } from '@vue/test-utils';
import { mount, createLocalVue, Wrapper } from '@vue/test-utils';
const localVue = createLocalVue();
localVue.use(VueCompositionAPI);

View File

@@ -34,9 +34,9 @@
</template>
<script lang="ts">
import { defineComponent, ref, onMounted, onBeforeUnmount, PropType } from '@vue/composition-api';
import { defineComponent, ref, PropType } from '@vue/composition-api';
import useEventListener from '@/compositions/event-listener';
import { Alignment, Header, Sort } from './types';
import { Header, Sort } from './types';
import { throttle, clone } from 'lodash';
export default defineComponent({
@@ -196,7 +196,7 @@ export default defineComponent({
}
}
function onMouseUp(event: MouseEvent) {
function onMouseUp() {
if (dragging.value === true) {
dragging.value = false;
}

View File

@@ -1,5 +1,5 @@
import VueCompositionAPI from '@vue/composition-api';
import { mount, createLocalVue, Wrapper, shallowMount } from '@vue/test-utils';
import { mount, createLocalVue, Wrapper } from '@vue/test-utils';
const localVue = createLocalVue();
localVue.use(VueCompositionAPI);

View File

@@ -24,7 +24,7 @@
<script lang="ts">
import { defineComponent, PropType } from '@vue/composition-api';
import { Header, Sort } from './types';
import { Header } from './types';
export default defineComponent({
props: {

View File

@@ -10,9 +10,14 @@ export type HeaderRaw = {
export type Header = Required<HeaderRaw>;
export type Item = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[key: string]: any;
};
export type ItemSelectEvent = {
value: boolean;
item: any;
item: Item;
};
export type Sort = {

View File

@@ -809,18 +809,19 @@ export const serverSort = () => ({
},
methods: {
onSort(sort: Sort) {
const self: any = this;
self.loading = true;
(this as any).loading = true;
setTimeout(() => {
self.items = [...self.items].sort((a, b) => (a[sort.by!] > b[sort.by!] ? 1 : -1));
(this as any).items = [...(this as any).items].sort((a, b) =>
a[sort.by!] > b[sort.by!] ? 1 : -1
);
if (sort.desc === true) {
self.items.reverse();
(this as any).items.reverse();
}
self.sort = sort;
self.loading = false;
(this as any).sort = sort;
(this as any).loading = false;
}, 2000);
}
},

View File

@@ -1,5 +1,5 @@
import VueCompositionAPI from '@vue/composition-api';
import { mount, createLocalVue, Wrapper, shallowMount } from '@vue/test-utils';
import { mount, createLocalVue, Wrapper } from '@vue/test-utils';
const localVue = createLocalVue();
localVue.use(VueCompositionAPI);

View File

@@ -59,15 +59,13 @@
</template>
<script lang="ts">
import { VNode } from 'vue';
import { defineComponent, computed, ref, watch, Ref, PropType } from '@vue/composition-api';
import { Header, HeaderRaw, ItemSelectEvent, Sort } from './types';
import { defineComponent, computed, ref, PropType } from '@vue/composition-api';
import { Header, HeaderRaw, Item, ItemSelectEvent, Sort } from './types';
import TableHeader from './_table-header.vue';
import TableRow from './_table-row.vue';
import { sortBy, clone, mapValues, forEach, pick } from 'lodash';
const draggable = require('vuedraggable');
const { i18n } = require('@/lang/');
import { sortBy, clone, forEach, pick } from 'lodash';
import { i18n } from '@/lang/';
import draggable from 'vuedraggable';
const HeaderDefaults: Header = {
text: '',
@@ -93,7 +91,7 @@ export default defineComponent({
required: true
},
items: {
type: Array as PropType<object[]>,
type: Array as PropType<Item[]>,
required: true
},
itemKey: {
@@ -117,7 +115,7 @@ export default defineComponent({
default: false
},
selection: {
type: Array as PropType<any[]>,
type: Array as PropType<Item[]>,
default: () => []
},
fixedHeader: {
@@ -141,7 +139,7 @@ export default defineComponent({
default: 48
}
},
setup(props, { slots, emit, listeners }) {
setup(props, { emit, listeners }) {
const _headers = computed({
get: () => {
return props.headers.map((header: HeaderRaw) => ({
@@ -154,7 +152,7 @@ export default defineComponent({
'update:headers',
// We'll return the original headers with the updated values, so we don't stage
// all the default values
newHeaders.map((header, index) => {
newHeaders.map(header => {
const keysThatArentDefault: string[] = [];
forEach(header, (value, key: string) => {
@@ -229,13 +227,13 @@ export default defineComponent({
function onItemSelected(event: ItemSelectEvent) {
emit('item-selected', event);
const selection: any[] = clone(props.selection);
const selection: Item[] = clone(props.selection);
if (event.value === true) {
selection.push(event.item);
} else {
const itemIndex: number = selection.findIndex(
(item: any) => item[props.itemKey] === event.item[props.itemKey]
(item: Item) => item[props.itemKey] === event.item[props.itemKey]
);
selection.splice(itemIndex, 1);
@@ -244,8 +242,8 @@ export default defineComponent({
emit('select', selection);
}
function getSelectedState(item: any) {
const selectedKeys = props.selection.map((item: any) => item[props.itemKey]);
function getSelectedState(item: Item) {
const selectedKeys = props.selection.map((item: Item) => item[props.itemKey]);
return selectedKeys.includes(item[props.itemKey]);
}

View File

@@ -1,4 +1,4 @@
import VueCompositionAPI, { ref } from '@vue/composition-api';
import { ref } from '@vue/composition-api';
import useEventListener from './event-listener';
import mountComposition from '../../.jest/mount-composition';
@@ -10,7 +10,7 @@ describe('Compositions / Event Listener', () => {
map[event] = cb;
});
window.removeEventListener = jest.fn((event, cb) => {
window.removeEventListener = jest.fn(event => {
delete map[event];
});
@@ -35,7 +35,7 @@ describe('Compositions / Event Listener', () => {
map[event] = cb;
});
window.removeEventListener = jest.fn((event, cb) => {
window.removeEventListener = jest.fn(event => {
delete map[event];
});

View File

@@ -1,7 +1,7 @@
import { onMounted, onUnmounted, ref } from '@vue/composition-api';
import formatDistance from 'date-fns/formatDistance';
export default function useFormatDistance(date: Date | number, autoUpdate: number = 60000) {
export default function useFormatDistance(date: Date | number, autoUpdate = 60000) {
let interval: number;
const formatOptions = {

View File

@@ -1,10 +1,10 @@
import VueCompositionAPI, { watch } from '@vue/composition-api';
import { watch } from '@vue/composition-api';
import useWindowSize from './window-size';
import mountComposition from '../../.jest/mount-composition';
describe('Compositions / Window Size', () => {
it('Adds passed event listener onMounted', async () => {
let testWidth: number = 0;
let testWidth = 0;
const component = mountComposition(() => {
const { width } = useWindowSize();
@@ -30,12 +30,12 @@ describe('Compositions / Window Size', () => {
map[event] = cb;
});
window.removeEventListener = jest.fn((event, cb) => {
window.removeEventListener = jest.fn(event => {
delete map[event];
});
const component = mountComposition(() => {
const { width } = useWindowSize();
useWindowSize();
});
expect(map.resize).toBeTruthy();

View File

@@ -1,4 +1,4 @@
import { onMounted, onUnmounted, ref, onBeforeMount, onBeforeUnmount } from '@vue/composition-api';
import { onMounted, onUnmounted, ref, onBeforeMount } from '@vue/composition-api';
import { throttle } from 'lodash';
type WindowSizeOptions = {

View File

@@ -1,11 +1,3 @@
import {
withKnobs,
text,
boolean,
number,
color,
optionsKnob as options
} from '@storybook/addon-knobs';
import Vue from 'vue';
import VButton from '../../components/v-button';
import VIcon from '../../components/v-icon';
@@ -17,8 +9,7 @@ Vue.component('v-icon', VIcon);
export default {
title: 'Directives / Tooltip',
component: VButton,
decorators: [withKnobs, withPadding],
decorators: [withPadding],
parameters: {
notes: markdown
}

View File

@@ -92,7 +92,7 @@ export async function setLanguage(lang: Language): Promise<boolean> {
}
i18n.locale = lang;
document.querySelector('html')!.setAttribute('lang', lang);
(document.querySelector('html') as HTMLElement).setAttribute('lang', lang);
return true;
}

View File

@@ -9,8 +9,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import VueI18n from 'vue-i18n';
import { defineComponent } from '@vue/composition-api';
import useNavigation from '../compositions/use-navigation';
export default defineComponent({

View File

@@ -13,7 +13,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import { defineComponent } from '@vue/composition-api';
import CollectionsNavigation from '../components/collections-navigation.vue';
import { i18n } from '@/lang';
import useNavigation, { NavItem } from '../compositions/use-navigation';

View File

@@ -2,7 +2,7 @@ import Vue from 'vue';
import VueCompositionAPI from '@vue/composition-api';
import { Route } from 'vue-router';
import * as hydration from '@/hydrate';
import router, {
import {
onBeforeEach,
onBeforeEnterProjectChooser,
replaceRoutes,

View File

@@ -15,7 +15,6 @@
<script lang="ts">
import { defineComponent, ref } from '@vue/composition-api';
import api from '@/api';
import { useProjectsStore } from '@/stores/projects';
import router from '@/router';
import { login } from '@/auth';

7
src/shims.d.ts vendored
View File

@@ -9,6 +9,11 @@ declare module '*.svg' {
}
declare module '*.md' {
const value: any;
const value: string;
export default value;
}
declare module 'vuedraggable' {
import Vue from 'vue';
export default Vue;
}

View File

@@ -4,7 +4,7 @@ import { Collection, CollectionRaw } from './types';
import useProjectsStore from '@/stores/projects';
import i18n from '@/lang/';
import { notEmpty } from '@/utils/is-empty';
import VueI18n, { LocaleMessages } from 'vue-i18n';
import VueI18n from 'vue-i18n';
import formatTitle from '@directus/format-title';
export const useCollectionsStore = createStore({

View File

@@ -76,9 +76,9 @@ describe('Stores / Projects', () => {
it('Returns true if the project exists', async () => {
const projectsStore = useProjectsStore({});
const spy = jest
.spyOn(api, 'get')
.mockImplementation(() => Promise.resolve({ data: { data: {} } }));
jest.spyOn(api, 'get').mockImplementation(() =>
Promise.resolve({ data: { data: {} } })
);
const result = await projectsStore.setCurrentProject('my-project');
expect(result).toBe(true);
});

View File

@@ -2,11 +2,16 @@ import { createStore } from 'pinia';
import { Projects, ProjectWithKey, ProjectError } from './types';
import api from '@/api';
type LoadingError = null | {
status: number;
error: string;
};
export const useProjectsStore = createStore({
id: 'projects',
state: () => ({
needsInstall: false,
error: null as any,
error: null as LoadingError,
projects: [] as Projects,
currentProjectKey: null as string | null
}),
@@ -47,7 +52,7 @@ export const useProjectsStore = createStore({
try {
const projectsResponse = await api.get('/server/projects');
const projectKeys: string[] = projectsResponse.data.data;
let projects: Projects = [];
const projects: Projects = [];
for (let index = 0; index < projectKeys.length; index++) {
try {

View File

@@ -8,9 +8,8 @@ export default function arraysAreEqual(
a1: readonly (string | number)[],
a2: readonly (string | number)[]
) {
let superSet: {
[key: string]: any;
[key: number]: any;
const superSet: {
[key: string]: number;
} = {};
for (let i = 0; i < a1.length; i++) {
@@ -26,7 +25,7 @@ export default function arraysAreEqual(
superSet[e] = 2;
}
for (let e in superSet) {
for (const e in superSet) {
if (superSet[e] === 1) {
return false;
}

View File

@@ -2,6 +2,7 @@ import Vue, { Component } from 'vue';
function registerComponent(id: string, component: Component): void;
function registerComponent(id: string, component: Parameters<typeof Vue.component>[1]): void;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function registerComponent(id: string, component: any) {
Vue.component(id, component);
}

View File

@@ -5,7 +5,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, watch, toRefs } from '@vue/composition-api';
import { defineComponent, ref, watch } from '@vue/composition-api';
export default defineComponent({
props: {

View File

@@ -8,7 +8,7 @@
</template>
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import { defineComponent } from '@vue/composition-api';
import ModuleBarLogo from './_module-bar-logo.vue';
import { useProjectsStore } from '@/stores/projects';
import { modules } from '@/modules/';

View File

@@ -15,7 +15,7 @@
</template>
<script lang="ts">
import { defineComponent, PropType, computed, ref, Ref, inject } from '@vue/composition-api';
import { defineComponent, ref, inject } from '@vue/composition-api';
import { useGroupable } from '@/compositions/groupable';
export default defineComponent({
@@ -29,7 +29,7 @@ export default defineComponent({
required: true
}
},
setup(props, { emit }) {
setup(props) {
const { active, toggle } = useGroupable(props.title);
const drawerOpen = inject('drawer-open', ref(false));
return { active, toggle, drawerOpen };

View File

@@ -1,4 +1,4 @@
import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueCompositionAPI from '@vue/composition-api';
import PrivateView from './private-view.vue';
import VOverlay from '@/components/v-overlay';

View File

@@ -51,10 +51,9 @@
</template>
<script lang="ts">
import { defineComponent, ref, computed, watch, provide } from '@vue/composition-api';
import { defineComponent, ref, computed, provide } from '@vue/composition-api';
import useWindowSize from '@/compositions/window-size';
import ModuleBar from './_module-bar.vue';
import api from '@/api';
import DrawerDetailGroup from './_drawer-detail-group.vue';
// Breakpoints:

View File

@@ -9,7 +9,6 @@
</template>
<script lang="ts">
import { version } from '../../../package.json';
import { defineComponent } from '@vue/composition-api';
export default defineComponent({

View File

@@ -1,4 +1,4 @@
import { withKnobs, boolean } from '@storybook/addon-knobs';
import { withKnobs } from '@storybook/addon-knobs';
import Vue from 'vue';
import PublicView from './public-view.vue';
import markdown from './public-view.readme.md';

View File

@@ -51,7 +51,7 @@ const mockProject: ProjectWithKey = {
};
describe('Views / Public', () => {
let store = useProjectsStore({});
const store = useProjectsStore({});
let component: Wrapper<Vue>;
beforeEach(() => {

View File

@@ -1859,17 +1859,6 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^1.1.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz#22fed9b16ddfeb402fd7bcde56307820f6ebc49f"
integrity sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==
dependencies:
"@typescript-eslint/experimental-utils" "1.13.0"
eslint-utils "^1.3.1"
functional-red-black-tree "^1.0.1"
regexpp "^2.0.1"
tsutils "^3.7.0"
"@typescript-eslint/eslint-plugin@^2.22.0":
version "2.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.22.0.tgz#218ce6d4aa0244c6a40baba39ca1e021b26bb017"
@@ -1881,15 +1870,6 @@
regexpp "^3.0.0"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e"
integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "1.13.0"
eslint-scope "^4.0.0"
"@typescript-eslint/experimental-utils@2.22.0":
version "2.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.22.0.tgz#4d00c91fbaaa68e56e7869be284999a265707f85"
@@ -1899,16 +1879,6 @@
"@typescript-eslint/typescript-estree" "2.22.0"
eslint-scope "^5.0.0"
"@typescript-eslint/parser@^1.1.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.13.0.tgz#61ac7811ea52791c47dc9fd4dd4a184fae9ac355"
integrity sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "1.13.0"
"@typescript-eslint/typescript-estree" "1.13.0"
eslint-visitor-keys "^1.0.0"
"@typescript-eslint/parser@^2.22.0":
version "2.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.22.0.tgz#8eeb6cb6de873f655e64153397d4790898e149d0"
@@ -1919,14 +1889,6 @@
"@typescript-eslint/typescript-estree" "2.22.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e"
integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==
dependencies:
lodash.unescape "4.0.1"
semver "5.5.0"
"@typescript-eslint/typescript-estree@2.22.0", "@typescript-eslint/typescript-estree@^2.22.0":
version "2.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.22.0.tgz#a16ed45876abf743e1f5857e2f4a1c3199fd219e"
@@ -2209,13 +2171,12 @@
dependencies:
eslint-config-prettier "^6.0.0"
"@vue/eslint-config-typescript@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@vue/eslint-config-typescript/-/eslint-config-typescript-4.0.0.tgz#a202983598a4a826460cbb8ee43826875b0f6673"
integrity sha512-uSMAMgw4xDgVdZQhpbtJRo8nMV4oOy3Ht8olfOo7xvYFYLMF2JZ1tDRKd9/NSusxA72O2Vma+HzmyzDHg9evcQ==
"@vue/eslint-config-typescript@^5.0.2":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@vue/eslint-config-typescript/-/eslint-config-typescript-5.0.2.tgz#c2f3328e70d55d10aeb826f209405397960548c7"
integrity sha512-GEZOHKOnelgQf5npA+6VNuhJZu9xEJaics3SYUyRjaSay+2SCpEINHhEpt6fXoNy/aIFt8CkDlt9CaEb+QPIcg==
dependencies:
"@typescript-eslint/eslint-plugin" "^1.1.0"
"@typescript-eslint/parser" "^1.1.0"
vue-eslint-parser "^7.0.0"
"@vue/preload-webpack-plugin@^1.1.0":
version "1.1.1"
@@ -5734,7 +5695,7 @@ eslint-plugin-vue@^6.2.1:
semver "^5.6.0"
vue-eslint-parser "^7.0.0"
eslint-scope@^4.0.0, eslint-scope@^4.0.3:
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@@ -9118,11 +9079,6 @@ lodash.transform@^4.6.0:
resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=
lodash.unescape@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@@ -12553,11 +12509,6 @@ semver-diff@^3.1.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
semver@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
@@ -14060,7 +14011,7 @@ tsutils@^2.29.0:
dependencies:
tslib "^1.8.1"
tsutils@^3.17.1, tsutils@^3.7.0:
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==