-
+
-
diff --git a/src/frontend/src/components/ExpandDetails.vue b/src/frontend/src/components/ExpandDetails.vue
index ec953de..2c3667c 100644
--- a/src/frontend/src/components/ExpandDetails.vue
+++ b/src/frontend/src/components/ExpandDetails.vue
@@ -1,8 +1,5 @@
-
+
-
-
+
+
{{ rowData.name }}
By {{ rowData.author }}
-
+
{{ rowData.description }}
-
-
+
edit
-
+
-
+
{{ version.name }}
-
+
edit
-
+
add version
@@ -84,22 +54,25 @@
-
diff --git a/src/frontend/src/components/IncludedList.vue b/src/frontend/src/components/IncludedList.vue
index 90560cd..3408d75 100644
--- a/src/frontend/src/components/IncludedList.vue
+++ b/src/frontend/src/components/IncludedList.vue
@@ -16,11 +16,7 @@
-
+
delete
@@ -28,17 +24,19 @@
-
diff --git a/src/frontend/src/components/ModTable.vue b/src/frontend/src/components/ModTable.vue
index 7857aa6..b4b12c8 100644
--- a/src/frontend/src/components/ModTable.vue
+++ b/src/frontend/src/components/ModTable.vue
@@ -1,6 +1,5 @@
-
-
-
diff --git a/src/frontend/src/components/PackTable.vue b/src/frontend/src/components/PackTable.vue
index 8f0d2ff..44d640c 100644
--- a/src/frontend/src/components/PackTable.vue
+++ b/src/frontend/src/components/PackTable.vue
@@ -1,6 +1,5 @@
-
@@ -43,144 +42,216 @@
/>
-
-
diff --git a/src/frontend/src/components/PackVersionDialog.vue b/src/frontend/src/components/PackVersionDialog.vue
index 903af1c..95753d9 100644
--- a/src/frontend/src/components/PackVersionDialog.vue
+++ b/src/frontend/src/components/PackVersionDialog.vue
@@ -9,34 +9,27 @@
Add version for {{ pack }}
-
+
-
+
-
+
-
+
add_circle_outline
-
+
-
-
+
+
Cancel
-
-
+
+
Save
-
+
error
@@ -146,165 +115,199 @@
-
diff --git a/src/frontend/src/components/RootCard.vue b/src/frontend/src/components/RootCard.vue
index 9d7f622..f870b58 100644
--- a/src/frontend/src/components/RootCard.vue
+++ b/src/frontend/src/components/RootCard.vue
@@ -2,31 +2,27 @@
{{ cardTitle }}
-
-
+
+
-
diff --git a/src/frontend/src/components/Snackbar.vue b/src/frontend/src/components/Snackbar.vue
index 7840b36..47465c3 100644
--- a/src/frontend/src/components/Snackbar.vue
+++ b/src/frontend/src/components/Snackbar.vue
@@ -1,39 +1,34 @@
-
+
{{ value.text }}
-
+
Close
-
diff --git a/src/frontend/src/ide-fix.js b/src/frontend/src/ide-fix.js
deleted file mode 100644
index 57eebfe..0000000
--- a/src/frontend/src/ide-fix.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import Vue from 'vue'
-
-Vue.component('v-app', {})
-Vue.component('v-autocomplete', {})
-Vue.component('v-badge', {})
-Vue.component('v-btn', {})
-Vue.component('v-card', {})
-Vue.component('v-card-actions', {})
-Vue.component('v-card-title', {})
-Vue.component('v-container', {})
-Vue.component('v-content', {})
-Vue.component('v-data-table', {})
-Vue.component('v-dialog', {})
-Vue.component('v-flex', {})
-Vue.component('v-footer', {})
-Vue.component('v-form', {})
-Vue.component('v-icon', {})
-Vue.component('v-layout', {})
-Vue.component('v-list', {})
-Vue.component('v-list-tile', {})
-Vue.component('v-list-tile-action', {})
-Vue.component('v-list-tile-content', {})
-Vue.component('v-list-tile-title', {})
-Vue.component('v-navigation-drawer', {})
-Vue.component('v-progress-linear', {})
-Vue.component('v-select', {})
-Vue.component('v-slider', {})
-Vue.component('v-snackbar', {})
-Vue.component('v-spacer', {})
-Vue.component('v-subheader', {})
-Vue.component('v-switch', {})
-Vue.component('v-text-field', {})
-Vue.component('v-toolbar', {})
-Vue.component('v-toolbar-side-icon', {})
-Vue.component('v-toolbar-title', {})
diff --git a/src/frontend/src/main.js b/src/frontend/src/main.js
deleted file mode 100644
index 9566643..0000000
--- a/src/frontend/src/main.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// The Vue build version to load with the `import` command
-// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
-import 'material-design-icons-iconfont/dist/material-design-icons.css'
-import 'typeface-roboto'
-import 'vuetify/dist/vuetify.min.css'
-import Vue from 'vue'
-import Vuetify from 'vuetify'
-import App from './App'
-import router from './router'
-import colors from 'vuetify/es5/util/colors'
-import axios from 'axios'
-
-const url = location.protocol + '//' + location.hostname + ':8081'
-const root = url + '/braze/api/'
-const constants = root + 'constants'
-const mods = root + 'mods'
-const packs = root + 'packs'
-
-if (url !== location.origin) { // for dev environment
- axios.defaults.headers.common['Authorization'] = 'Basic dXNlcjpjaGFuZ2VtZQ=='
-}
-
-const latency = 1600 // artifical latency
-
-Vue.config.productionTip = false
-
-Vue.use(Vuetify, {
- theme: {
- 'primary': colors.orange.darken2,
- 'accent': colors.blue.base
- }
-})
-
-Vue.mixin({
- methods: {
- getConstants (success, error) {
- get(constants, success, error)
- },
- getMods (success, error) {
- get(mods, success, error)
- },
- getMod (slug, success, error) {
- get(`${mods}/${slug}`, success, error)
- },
- getPack (slug, success, error) {
- get(`${packs}/${slug}`, success, error)
- },
- getPacks (success, error) {
- get(packs, success, error)
- },
- postMod (data, success, error) {
- post(mods, data, success, error)
- },
- postModVersion (slug, data, success, error) {
- post(`${mods}/${slug}`, data, success, error)
- },
- postPack (data, success, error) {
- post(packs, data, success, error)
- },
- postPackVersion (slug, data, success, error) {
- post(`${packs}/${slug}`, data, success, error)
- },
- slugify (str) {
- return str.toLowerCase()
- .replace(/[^\w\s-]/g, '') // remove non-word [a-z0-9_], non-whitespace, non-hyphen characters
- .replace(/[\s_-]+/g, '-') // swap any length of whitespace, underscore, hyphen characters with a single -
- .replace(/^-+|-+$/g, '') // remove leading, trailing -
- // function written by kganser https://gist.github.com/mathewbyrne/1280286#gistcomment-1716050
- }
- }
-})
-
-/* eslint-disable no-new */
-new Vue({
- el: '#app',
- router,
- components: { App },
- template: ''
-})
-
-function get (url, success, error) {
- loadAndThen(() =>
- axios.get(url).then(success).catch(error)
- )
-}
-
-function post (url, data, success, error) {
- loadAndThen(() =>
- axios.post(url, data).then(success).catch(e => {
- console.error(e.response.data)
- error(e)
- })
- )
-}
-
-function loadAndThen (cb) {
- setTimeout(cb, latency)
-}
diff --git a/src/frontend/src/main.ts b/src/frontend/src/main.ts
new file mode 100644
index 0000000..aee57e3
--- /dev/null
+++ b/src/frontend/src/main.ts
@@ -0,0 +1,27 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import 'material-design-icons-iconfont/dist/material-design-icons.css';
+import 'typeface-roboto';
+import 'vuetify/dist/vuetify.min.css';
+import Vue from 'vue';
+import Vuetify from 'vuetify';
+import colors from 'vuetify/es5/util/colors';
+import App from './components/App.vue';
+import router from './router';
+
+Vue.config.productionTip = false;
+
+Vue.use(Vuetify, {
+ theme: {
+ primary: colors.orange.darken2,
+ accent: colors.blue.base,
+ },
+});
+
+/* eslint-disable no-new */
+new Vue({
+ el: '#app',
+ router,
+ components: { App },
+ template: '',
+});
diff --git a/src/frontend/src/model.ts b/src/frontend/src/model.ts
new file mode 100644
index 0000000..0cc58b0
--- /dev/null
+++ b/src/frontend/src/model.ts
@@ -0,0 +1,20 @@
+export interface DynamicInput {
+ name: string;
+ key: 'name' | 'slug' | 'author' | 'description' | 'link' | 'donate';
+ icon: string;
+ value: string | null;
+ readonly?: boolean;
+}
+
+export interface Expansion {
+ index: number;
+ slug: string;
+ expanded: boolean;
+}
+
+export interface BasicElement {
+ name: string;
+ slug: string;
+ author: string;
+ description: string;
+}
diff --git a/src/frontend/src/router/index.js b/src/frontend/src/router/index.js
deleted file mode 100644
index 4500cba..0000000
--- a/src/frontend/src/router/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import ModTable from '@/components/ModTable'
-import PackTable from '@/components/PackTable'
-
-Vue.use(Router)
-
-export default new Router({
- routes: [
- {
- path: '/mods',
- name: 'Mods',
- component: ModTable
- },
- {
- path: '/packs',
- name: 'Packs',
- component: PackTable
- }
- ]
-})
diff --git a/src/frontend/src/router/index.ts b/src/frontend/src/router/index.ts
new file mode 100644
index 0000000..093c7b5
--- /dev/null
+++ b/src/frontend/src/router/index.ts
@@ -0,0 +1,21 @@
+import Vue from 'vue';
+import Router from 'vue-router';
+import ModTable from '@/components/ModTable.vue';
+import PackTable from '@/components/PackTable.vue';
+
+Vue.use(Router);
+
+export default new Router({
+ routes: [
+ {
+ path: '/mods',
+ name: 'Mods',
+ component: ModTable,
+ },
+ {
+ path: '/packs',
+ name: 'Packs',
+ component: PackTable,
+ },
+ ],
+});
diff --git a/src/frontend/src/shims-tsx.d.ts b/src/frontend/src/shims-tsx.d.ts
new file mode 100644
index 0000000..70111e9
--- /dev/null
+++ b/src/frontend/src/shims-tsx.d.ts
@@ -0,0 +1,14 @@
+/* eslint-disable */
+import Vue, { VNode } from 'vue';
+
+declare global {
+ namespace JSX {
+ // tslint:disable no-empty-interface
+ interface Element extends VNode {}
+ // tslint:disable no-empty-interface
+ interface ElementClass extends Vue {}
+ interface IntrinsicElements {
+ [elem: string]: any;
+ }
+ }
+}
diff --git a/src/frontend/src/shims-vue.d.ts b/src/frontend/src/shims-vue.d.ts
new file mode 100644
index 0000000..6cd55d9
--- /dev/null
+++ b/src/frontend/src/shims-vue.d.ts
@@ -0,0 +1,10 @@
+/* eslint-disable */
+declare module '*.vue' {
+ import Vue from 'vue';
+ export default Vue;
+}
+
+declare module 'vuetify-upload-button' {
+ let UploadButton: any;
+ export default UploadButton;
+}
diff --git a/src/frontend/src/shims-vuetify.ts b/src/frontend/src/shims-vuetify.ts
new file mode 100644
index 0000000..0e5eb06
--- /dev/null
+++ b/src/frontend/src/shims-vuetify.ts
@@ -0,0 +1,2174 @@
+/* eslint-disable */
+import Vue from 'vue';
+import { PropValidator } from 'vue/types/options';
+
+Vue.component('v-app', {
+ props: {
+ dark: Boolean,
+ id: String,
+ light: Boolean,
+ },
+});
+Vue.component('v-alert', {
+ props: {
+ color: String,
+ dismissible: Boolean,
+ icon: String,
+ mode: String,
+ origin: String,
+ outline: Boolean,
+ transition: String,
+ type: String,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-autocomplete', {
+ props: {
+ allowOverflow: Boolean,
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ attach: (null as any) as PropValidator,
+ autoSelectFirst: Boolean,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ cacheItems: Boolean,
+ chips: Boolean,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ deletableChips: Boolean,
+ dense: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ filter: Function,
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hideNoData: Boolean,
+ hideSelected: Boolean,
+ hint: String,
+ itemAvatar: [String, Array, Function],
+ itemDisabled: [String, Array, Function],
+ itemText: [String, Array, Function],
+ itemValue: [String, Array, Function],
+ items: Array,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ menuProps: [String, Array, Object],
+ messages: [String, Array],
+ multiple: Boolean,
+ noDataText: String,
+ noFilter: Boolean,
+ openOnClear: Boolean,
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ returnObject: Boolean,
+ reverse: Boolean,
+ rules: Array,
+ searchInput: (null as any) as PropValidator,
+ singleLine: Boolean,
+ smallChips: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-avatar', {
+ props: {
+ color: String,
+ size: [Number, String],
+ tile: Boolean,
+ },
+});
+Vue.component('v-badge', {
+ props: {
+ bottom: Boolean,
+ color: String,
+ left: Boolean,
+ mode: String,
+ origin: String,
+ overlap: Boolean,
+ transition: String,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-bottom-nav', {
+ props: {
+ absolute: Boolean,
+ active: [Number, String],
+ app: Boolean,
+ color: String,
+ dark: Boolean,
+ fixed: Boolean,
+ height: [Number, String],
+ light: Boolean,
+ mandatory: Boolean,
+ shift: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-bottom-sheet', {
+ props: {
+ disabled: Boolean,
+ fullWidth: Boolean,
+ hideOverlay: Boolean,
+ inset: Boolean,
+ lazy: Boolean,
+ maxWidth: [String, Number],
+ persistent: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-breadcrumbs', {
+ props: {
+ dark: Boolean,
+ divider: String,
+ items: Array,
+ justifyCenter: Boolean,
+ justifyEnd: Boolean,
+ large: Boolean,
+ light: Boolean,
+ },
+});
+Vue.component('v-breadcrumbs-item', {
+ props: {
+ activeClass: String,
+ append: Boolean,
+ disabled: Boolean,
+ exact: Boolean,
+ exactActiveClass: String,
+ href: [String, Object],
+ nuxt: Boolean,
+ replace: Boolean,
+ ripple: [Boolean, Object],
+ tag: String,
+ target: String,
+ to: [String, Object],
+ },
+});
+Vue.component('v-breadcrumbs-divider', {});
+Vue.component('v-btn', {
+ props: {
+ absolute: Boolean,
+ activeClass: String,
+ append: Boolean,
+ block: Boolean,
+ bottom: Boolean,
+ color: String,
+ dark: Boolean,
+ depressed: Boolean,
+ disabled: Boolean,
+ exact: Boolean,
+ exactActiveClass: String,
+ fab: Boolean,
+ fixed: Boolean,
+ flat: Boolean,
+ href: [String, Object],
+ icon: Boolean,
+ inputValue: (null as any) as PropValidator,
+ large: Boolean,
+ left: Boolean,
+ light: Boolean,
+ loading: Boolean,
+ nuxt: Boolean,
+ outline: Boolean,
+ replace: Boolean,
+ right: Boolean,
+ ripple: [Boolean, Object],
+ round: Boolean,
+ small: Boolean,
+ tag: String,
+ target: String,
+ to: [String, Object],
+ top: Boolean,
+ type: String,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-btn-toggle', {
+ props: {
+ activeClass: String,
+ dark: Boolean,
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ multiple: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-card', {
+ props: {
+ activeClass: String,
+ append: Boolean,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ elevation: [Number, String],
+ exact: Boolean,
+ exactActiveClass: String,
+ flat: Boolean,
+ height: [Number, String],
+ hover: Boolean,
+ href: [String, Object],
+ img: String,
+ light: Boolean,
+ maxHeight: [Number, String],
+ maxWidth: [Number, String],
+ minHeight: [Number, String],
+ minWidth: [Number, String],
+ nuxt: Boolean,
+ raised: Boolean,
+ replace: Boolean,
+ ripple: [Boolean, Object],
+ tag: String,
+ target: String,
+ tile: Boolean,
+ to: [String, Object],
+ width: [Number, String],
+ },
+});
+Vue.component('v-card-media', {
+ props: {
+ alt: String,
+ aspectRatio: [String, Number],
+ contain: Boolean,
+ gradient: String,
+ height: [Number, String],
+ lazySrc: String,
+ maxHeight: [Number, String],
+ maxWidth: [Number, String],
+ minHeight: [Number, String],
+ minWidth: [Number, String],
+ position: String,
+ sizes: String,
+ src: [String, Object],
+ srcset: String,
+ transition: [Boolean, String],
+ width: [Number, String],
+ },
+});
+Vue.component('v-card-title', {
+ props: {
+ primaryTitle: Boolean,
+ },
+});
+Vue.component('v-card-actions', {});
+Vue.component('v-card-text', {});
+Vue.component('v-carousel', {
+ props: {
+ activeClass: String,
+ cycle: Boolean,
+ dark: Boolean,
+ delimiterIcon: String,
+ height: [Number, String],
+ hideControls: Boolean,
+ hideDelimiters: Boolean,
+ interval: [Number, String],
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ multiple: Boolean,
+ nextIcon: [Boolean, String],
+ prevIcon: [Boolean, String],
+ reverse: Boolean,
+ touch: Object,
+ touchless: Boolean,
+ value: (null as any) as PropValidator,
+ vertical: Boolean,
+ },
+});
+Vue.component('v-carousel-item', {
+ props: {
+ activeClass: String,
+ disabled: Boolean,
+ lazy: Boolean,
+ reverseTransition: [Boolean, String],
+ transition: [Boolean, String],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-checkbox', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ falseValue: (null as any) as PropValidator,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ id: String,
+ indeterminate: Boolean,
+ indeterminateIcon: String,
+ inputValue: (null as any) as PropValidator,
+ label: String,
+ light: Boolean,
+ loading: Boolean,
+ messages: [String, Array],
+ multiple: Boolean,
+ offIcon: String,
+ onIcon: String,
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ ripple: [Boolean, Object],
+ rules: Array,
+ success: Boolean,
+ successMessages: [String, Array],
+ trueValue: (null as any) as PropValidator,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-chip', {
+ props: {
+ close: Boolean,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ label: Boolean,
+ light: Boolean,
+ outline: Boolean,
+ selected: Boolean,
+ small: Boolean,
+ textColor: String,
+ value: Boolean,
+ },
+});
+Vue.component('v-combobox', {
+ props: {
+ allowOverflow: Boolean,
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ attach: (null as any) as PropValidator,
+ autoSelectFirst: Boolean,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ cacheItems: Boolean,
+ chips: Boolean,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ deletableChips: Boolean,
+ delimiters: Array,
+ dense: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ filter: Function,
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hideNoData: Boolean,
+ hideSelected: Boolean,
+ hint: String,
+ itemAvatar: [String, Array, Function],
+ itemDisabled: [String, Array, Function],
+ itemText: [String, Array, Function],
+ itemValue: [String, Array, Function],
+ items: Array,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ menuProps: [String, Array, Object],
+ messages: [String, Array],
+ multiple: Boolean,
+ noDataText: String,
+ noFilter: Boolean,
+ openOnClear: Boolean,
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ returnObject: Boolean,
+ reverse: Boolean,
+ rules: Array,
+ searchInput: (null as any) as PropValidator,
+ singleLine: Boolean,
+ smallChips: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-counter', {
+ props: {
+ dark: Boolean,
+ light: Boolean,
+ max: [Number, String],
+ value: [Number, String],
+ },
+});
+Vue.component('v-data-iterator', {
+ props: {
+ contentClass: String,
+ contentProps: Object,
+ contentTag: String,
+ customFilter: Function,
+ customSort: Function,
+ dark: Boolean,
+ disableInitialSort: Boolean,
+ expand: Boolean,
+ filter: Function,
+ hideActions: Boolean,
+ itemKey: String,
+ items: Array,
+ light: Boolean,
+ loading: [Boolean, String],
+ mustSort: Boolean,
+ nextIcon: String,
+ noDataText: String,
+ noResultsText: String,
+ pagination: Object,
+ prevIcon: String,
+ rowsPerPageItems: Array,
+ rowsPerPageText: String,
+ search: (null as any) as PropValidator,
+ selectAll: [Boolean, String],
+ totalItems: Number,
+ value: Array,
+ },
+});
+Vue.component('v-data-table', {
+ props: {
+ customFilter: Function,
+ customSort: Function,
+ dark: Boolean,
+ disableInitialSort: Boolean,
+ expand: Boolean,
+ filter: Function,
+ headerKey: String,
+ headerText: String,
+ headers: Array,
+ headersLength: Number,
+ hideActions: Boolean,
+ hideHeaders: Boolean,
+ itemKey: String,
+ items: Array,
+ light: Boolean,
+ loading: [Boolean, String],
+ mustSort: Boolean,
+ nextIcon: String,
+ noDataText: String,
+ noResultsText: String,
+ pagination: Object,
+ prevIcon: String,
+ rowsPerPageItems: Array,
+ rowsPerPageText: String,
+ search: (null as any) as PropValidator,
+ selectAll: [Boolean, String],
+ sortIcon: String,
+ totalItems: Number,
+ value: Array,
+ },
+});
+Vue.component('v-edit-dialog', {
+ props: {
+ cancelText: (null as any) as PropValidator,
+ dark: Boolean,
+ large: Boolean,
+ lazy: Boolean,
+ light: Boolean,
+ persistent: Boolean,
+ returnValue: (null as any) as PropValidator,
+ saveText: (null as any) as PropValidator,
+ transition: String,
+ },
+});
+Vue.component('v-table-overflow', {});
+Vue.component('v-date-picker', {
+ props: {
+ allowedDates: Function,
+ color: String,
+ dark: Boolean,
+ dayFormat: Function,
+ disabled: Boolean,
+ eventColor: [Array, Function, Object, String],
+ events: [Array, Function, Object],
+ firstDayOfWeek: [String, Number],
+ fullWidth: Boolean,
+ headerColor: String,
+ headerDateFormat: Function,
+ landscape: Boolean,
+ light: Boolean,
+ locale: String,
+ max: String,
+ min: String,
+ monthFormat: Function,
+ multiple: Boolean,
+ nextIcon: String,
+ noTitle: Boolean,
+ pickerDate: String,
+ prevIcon: String,
+ reactive: Boolean,
+ readonly: Boolean,
+ scrollable: Boolean,
+ showCurrent: [Boolean, String],
+ showWeek: Boolean,
+ titleDateFormat: Function,
+ type: String,
+ value: [Array, String],
+ weekdayFormat: Function,
+ width: [Number, String],
+ yearFormat: Function,
+ yearIcon: String,
+ },
+});
+Vue.component('v-date-picker-title', {
+ props: {
+ color: String,
+ date: String,
+ disabled: Boolean,
+ readonly: Boolean,
+ selectingYear: Boolean,
+ value: String,
+ year: [Number, String],
+ yearIcon: String,
+ },
+});
+Vue.component('v-date-picker-header', {
+ props: {
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ format: Function,
+ light: Boolean,
+ locale: String,
+ max: String,
+ min: String,
+ nextIcon: String,
+ prevIcon: String,
+ readonly: Boolean,
+ value: [Number, String],
+ },
+});
+Vue.component('v-date-picker-date-table', {
+ props: {
+ allowedDates: Function,
+ color: String,
+ current: String,
+ dark: Boolean,
+ disabled: Boolean,
+ eventColor: [Array, Function, Object, String],
+ events: [Array, Function, Object],
+ firstDayOfWeek: [String, Number],
+ format: Function,
+ light: Boolean,
+ locale: String,
+ max: String,
+ min: String,
+ readonly: Boolean,
+ scrollable: Boolean,
+ showWeek: Boolean,
+ tableDate: String,
+ value: [String, Array],
+ weekdayFormat: Function,
+ },
+});
+Vue.component('v-date-picker-month-table', {
+ props: {
+ allowedDates: Function,
+ color: String,
+ current: String,
+ dark: Boolean,
+ disabled: Boolean,
+ eventColor: [Array, Function, Object, String],
+ events: [Array, Function, Object],
+ format: Function,
+ light: Boolean,
+ locale: String,
+ max: String,
+ min: String,
+ readonly: Boolean,
+ scrollable: Boolean,
+ tableDate: String,
+ value: [String, Array],
+ },
+});
+Vue.component('v-date-picker-years', {
+ props: {
+ color: String,
+ format: Function,
+ locale: String,
+ max: [Number, String],
+ min: [Number, String],
+ readonly: Boolean,
+ value: [Number, String],
+ },
+});
+Vue.component('v-dialog', {
+ props: {
+ attach: (null as any) as PropValidator,
+ contentClass: (null as any) as PropValidator,
+ dark: Boolean,
+ disabled: Boolean,
+ fullWidth: Boolean,
+ fullscreen: Boolean,
+ hideOverlay: Boolean,
+ lazy: Boolean,
+ light: Boolean,
+ maxWidth: [String, Number],
+ noClickAnimation: Boolean,
+ origin: String,
+ persistent: Boolean,
+ returnValue: (null as any) as PropValidator,
+ scrollable: Boolean,
+ transition: [String, Boolean],
+ value: (null as any) as PropValidator,
+ width: [String, Number],
+ },
+});
+Vue.component('v-divider', {
+ props: {
+ dark: Boolean,
+ inset: Boolean,
+ light: Boolean,
+ vertical: Boolean,
+ },
+});
+Vue.component('v-expansion-panel', {
+ props: {
+ dark: Boolean,
+ disabled: Boolean,
+ expand: Boolean,
+ focusable: Boolean,
+ inset: Boolean,
+ light: Boolean,
+ popout: Boolean,
+ readonly: Boolean,
+ value: [Number, Array],
+ },
+});
+Vue.component('v-expansion-panel-content', {
+ props: {
+ disabled: Boolean,
+ expandIcon: String,
+ hideActions: Boolean,
+ lazy: Boolean,
+ readonly: Boolean,
+ ripple: [Boolean, Object],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-footer', {
+ props: {
+ absolute: Boolean,
+ app: Boolean,
+ color: String,
+ dark: Boolean,
+ fixed: Boolean,
+ height: [Number, String],
+ inset: Boolean,
+ light: Boolean,
+ },
+});
+Vue.component('v-form', {
+ props: {
+ lazyValidation: Boolean,
+ value: Boolean,
+ },
+});
+Vue.component('v-container', {
+ props: {
+ alignBaseline: Boolean,
+ alignCenter: Boolean,
+ alignContentCenter: Boolean,
+ alignContentEnd: Boolean,
+ alignContentSpaceAround: Boolean,
+ alignContentSpaceBetween: Boolean,
+ alignContentStart: Boolean,
+ alignEnd: Boolean,
+ alignStart: Boolean,
+ 'd-{type}': Boolean,
+ fillHeight: Boolean,
+ fluid: Boolean,
+ 'grid-list-{xs through xl}': Boolean,
+ id: String,
+ justifyCenter: Boolean,
+ justifyEnd: Boolean,
+ justifySpaceAround: Boolean,
+ justifySpaceBetween: Boolean,
+ justifyStart: Boolean,
+ tag: String,
+ },
+});
+Vue.component('v-content', {
+ props: {
+ tag: String,
+ },
+});
+Vue.component('v-flex', {
+ props: {
+ '(size)(1-12)': Boolean,
+ alignSelfBaseline: Boolean,
+ alignSelfCenter: Boolean,
+ alignSelfEnd: Boolean,
+ alignSelfStart: Boolean,
+ grow: Boolean,
+ id: String,
+ 'offset-(size)(0-12)': Boolean,
+ 'order-(size)(1-12)': Boolean,
+ shrink: Boolean,
+ tag: String,
+ },
+});
+Vue.component('v-layout', {
+ props: {
+ alignBaseline: Boolean,
+ alignCenter: Boolean,
+ alignContentCenter: Boolean,
+ alignContentEnd: Boolean,
+ alignContentSpaceAround: Boolean,
+ alignContentSpaceBetween: Boolean,
+ alignContentStart: Boolean,
+ alignEnd: Boolean,
+ alignStart: Boolean,
+ column: Boolean,
+ 'd-{type}': Boolean,
+ fillHeight: Boolean,
+ id: String,
+ justifyCenter: Boolean,
+ justifyEnd: Boolean,
+ justifySpaceAround: Boolean,
+ justifySpaceBetween: Boolean,
+ justifyStart: Boolean,
+ reverse: Boolean,
+ row: Boolean,
+ tag: String,
+ wrap: Boolean,
+ },
+});
+Vue.component('v-spacer', {});
+Vue.component('v-hover', {
+ props: {
+ closeDelay: [Number, String],
+ disabled: Boolean,
+ openDelay: [Number, String],
+ value: Boolean,
+ },
+});
+Vue.component('v-icon', {
+ props: {
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ large: Boolean,
+ left: Boolean,
+ light: Boolean,
+ medium: Boolean,
+ right: Boolean,
+ size: [Number, String],
+ small: Boolean,
+ xLarge: Boolean,
+ },
+});
+Vue.component('v-img', {
+ props: {
+ alt: String,
+ aspectRatio: [String, Number],
+ contain: Boolean,
+ gradient: String,
+ height: [Number, String],
+ lazySrc: String,
+ maxHeight: [Number, String],
+ maxWidth: [Number, String],
+ minHeight: [Number, String],
+ minWidth: [Number, String],
+ position: String,
+ sizes: String,
+ src: [String, Object],
+ srcset: String,
+ transition: [Boolean, String],
+ width: [Number, String],
+ },
+});
+Vue.component('v-input', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ label: String,
+ light: Boolean,
+ loading: Boolean,
+ messages: [String, Array],
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ rules: Array,
+ success: Boolean,
+ successMessages: [String, Array],
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-item', {
+ props: {
+ activeClass: String,
+ disabled: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-item-group', {
+ props: {
+ activeClass: String,
+ dark: Boolean,
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ multiple: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-jumbotron', {
+ props: {
+ activeClass: String,
+ append: Boolean,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ exact: Boolean,
+ exactActiveClass: String,
+ gradient: String,
+ height: [Number, String],
+ href: [String, Object],
+ light: Boolean,
+ nuxt: Boolean,
+ replace: Boolean,
+ ripple: [Boolean, Object],
+ src: String,
+ tag: String,
+ target: String,
+ to: [String, Object],
+ },
+});
+Vue.component('v-label', {
+ props: {
+ absolute: Boolean,
+ color: [Boolean, String],
+ dark: Boolean,
+ disabled: Boolean,
+ focused: Boolean,
+ for: String,
+ left: [Number, String],
+ light: Boolean,
+ right: [Number, String],
+ value: Boolean,
+ },
+});
+Vue.component('v-list', {
+ props: {
+ dark: Boolean,
+ dense: Boolean,
+ expand: Boolean,
+ light: Boolean,
+ subheader: Boolean,
+ threeLine: Boolean,
+ twoLine: Boolean,
+ },
+});
+Vue.component('v-list-group', {
+ props: {
+ activeClass: String,
+ appendIcon: String,
+ disabled: Boolean,
+ group: String,
+ lazy: Boolean,
+ noAction: Boolean,
+ prependIcon: String,
+ subGroup: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-list-tile', {
+ props: {
+ activeClass: String,
+ append: Boolean,
+ avatar: Boolean,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ exact: Boolean,
+ exactActiveClass: String,
+ href: [String, Object],
+ inactive: Boolean,
+ light: Boolean,
+ nuxt: Boolean,
+ replace: Boolean,
+ ripple: [Boolean, Object],
+ tag: String,
+ target: String,
+ to: [String, Object],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-list-tile-action', {});
+Vue.component('v-list-tile-avatar', {
+ props: {
+ color: String,
+ size: [Number, String],
+ tile: Boolean,
+ },
+});
+Vue.component('v-list-tile-action-text', {});
+Vue.component('v-list-tile-content', {});
+Vue.component('v-list-tile-title', {});
+Vue.component('v-list-tile-sub-title', {});
+Vue.component('v-menu', {
+ props: {
+ absolute: Boolean,
+ activator: (null as any) as PropValidator,
+ allowOverflow: Boolean,
+ attach: (null as any) as PropValidator,
+ auto: Boolean,
+ bottom: Boolean,
+ closeDelay: [Number, String],
+ closeOnClick: Boolean,
+ closeOnContentClick: Boolean,
+ contentClass: (null as any) as PropValidator,
+ dark: Boolean,
+ disableKeys: Boolean,
+ disabled: Boolean,
+ fixed: Boolean,
+ fullWidth: Boolean,
+ inputActivator: Boolean,
+ lazy: Boolean,
+ left: Boolean,
+ light: Boolean,
+ maxHeight: (null as any) as PropValidator,
+ maxWidth: [Number, String],
+ minWidth: [Number, String],
+ nudgeBottom: [Number, String],
+ nudgeLeft: [Number, String],
+ nudgeRight: [Number, String],
+ nudgeTop: [Number, String],
+ nudgeWidth: [Number, String],
+ offsetOverflow: Boolean,
+ offsetX: Boolean,
+ offsetY: Boolean,
+ openDelay: [Number, String],
+ openOnClick: Boolean,
+ openOnHover: Boolean,
+ origin: String,
+ positionX: Number,
+ positionY: Number,
+ returnValue: (null as any) as PropValidator,
+ right: Boolean,
+ top: Boolean,
+ transition: [Boolean, String],
+ value: (null as any) as PropValidator,
+ zIndex: [Number, String],
+ },
+});
+Vue.component('v-messages', {
+ props: {
+ color: String,
+ dark: Boolean,
+ light: Boolean,
+ value: Array,
+ },
+});
+Vue.component('v-navigation-drawer', {
+ props: {
+ absolute: Boolean,
+ app: Boolean,
+ clipped: Boolean,
+ dark: Boolean,
+ disableResizeWatcher: Boolean,
+ disableRouteWatcher: Boolean,
+ fixed: Boolean,
+ floating: Boolean,
+ height: [Number, String],
+ hideOverlay: Boolean,
+ light: Boolean,
+ miniVariant: Boolean,
+ miniVariantWidth: [Number, String],
+ mobileBreakPoint: [Number, String],
+ permanent: Boolean,
+ right: Boolean,
+ stateless: Boolean,
+ temporary: Boolean,
+ touchless: Boolean,
+ value: (null as any) as PropValidator,
+ width: [Number, String],
+ },
+});
+Vue.component('v-overflow-btn', {
+ props: {
+ allowOverflow: Boolean,
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ attach: (null as any) as PropValidator,
+ autoSelectFirst: Boolean,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ cacheItems: Boolean,
+ chips: Boolean,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ deletableChips: Boolean,
+ dense: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ editable: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ filter: Function,
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hideNoData: Boolean,
+ hideSelected: Boolean,
+ hint: String,
+ itemAvatar: [String, Array, Function],
+ itemDisabled: [String, Array, Function],
+ itemText: [String, Array, Function],
+ itemValue: [String, Array, Function],
+ items: Array,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ menuProps: [String, Array, Object],
+ messages: [String, Array],
+ multiple: Boolean,
+ noDataText: String,
+ noFilter: Boolean,
+ openOnClear: Boolean,
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ returnObject: Boolean,
+ reverse: Boolean,
+ rules: Array,
+ searchInput: (null as any) as PropValidator,
+ segmented: Boolean,
+ singleLine: Boolean,
+ smallChips: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ transition: (null as any) as PropValidator,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-pagination', {
+ props: {
+ circle: Boolean,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ length: Number,
+ light: Boolean,
+ nextIcon: String,
+ prevIcon: String,
+ totalVisible: [Number, String],
+ value: Number,
+ },
+});
+Vue.component('v-sheet', {
+ props: {
+ color: String,
+ dark: Boolean,
+ elevation: [Number, String],
+ height: [Number, String],
+ light: Boolean,
+ maxHeight: [Number, String],
+ maxWidth: [Number, String],
+ minHeight: [Number, String],
+ minWidth: [Number, String],
+ tag: String,
+ tile: Boolean,
+ width: [Number, String],
+ },
+});
+Vue.component('v-parallax', {
+ props: {
+ alt: String,
+ height: [String, Number],
+ src: String,
+ },
+});
+Vue.component('v-picker', {
+ props: {
+ color: String,
+ dark: Boolean,
+ fullWidth: Boolean,
+ landscape: Boolean,
+ light: Boolean,
+ transition: String,
+ width: [Number, String],
+ },
+});
+Vue.component('v-progress-circular', {
+ props: {
+ button: Boolean,
+ color: String,
+ indeterminate: Boolean,
+ rotate: [Number, String],
+ size: [Number, String],
+ value: [Number, String],
+ width: [Number, String],
+ },
+});
+Vue.component('v-progress-linear', {
+ props: {
+ active: Boolean,
+ backgroundColor: String,
+ backgroundOpacity: [Number, String],
+ bufferValue: [Number, String],
+ color: String,
+ height: [Number, String],
+ indeterminate: Boolean,
+ query: Boolean,
+ value: [Number, String],
+ },
+});
+Vue.component('v-radio-group', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ column: Boolean,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ label: String,
+ light: Boolean,
+ loading: Boolean,
+ mandatory: Boolean,
+ messages: [String, Array],
+ name: String,
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ row: Boolean,
+ rules: Array,
+ success: Boolean,
+ successMessages: [String, Array],
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-radio', {
+ props: {
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ label: String,
+ light: Boolean,
+ offIcon: String,
+ onIcon: String,
+ readonly: Boolean,
+ ripple: [Boolean, Object],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-range-slider', {
+ props: {
+ alwaysDirty: Boolean,
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ inverseLabel: Boolean,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ max: [Number, String],
+ messages: [String, Array],
+ min: [Number, String],
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ rules: Array,
+ step: [Number, String],
+ success: Boolean,
+ successMessages: [String, Array],
+ thumbColor: String,
+ thumbLabel: [Boolean, String],
+ thumbSize: [Number, String],
+ tickLabels: Array,
+ tickSize: [Number, String],
+ ticks: [Boolean, String],
+ trackColor: String,
+ validateOnBlur: Boolean,
+ value: Array,
+ },
+});
+Vue.component('v-rating', {
+ props: {
+ backgroundColor: String,
+ clearable: Boolean,
+ closeDelay: [Number, String],
+ color: String,
+ dark: Boolean,
+ dense: Boolean,
+ emptyIcon: String,
+ fullIcon: String,
+ halfIcon: String,
+ halfIncrements: Boolean,
+ hover: Boolean,
+ large: Boolean,
+ length: [Number, String],
+ light: Boolean,
+ medium: Boolean,
+ openDelay: [Number, String],
+ readonly: Boolean,
+ ripple: [Boolean, Object],
+ size: [Number, String],
+ small: Boolean,
+ value: Number,
+ xLarge: Boolean,
+ },
+});
+Vue.component('v-responsive', {
+ props: {
+ aspectRatio: [String, Number],
+ height: [Number, String],
+ maxHeight: [Number, String],
+ maxWidth: [Number, String],
+ minHeight: [Number, String],
+ minWidth: [Number, String],
+ width: [Number, String],
+ },
+});
+Vue.component('v-select', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ attach: (null as any) as PropValidator,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ cacheItems: Boolean,
+ chips: Boolean,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ deletableChips: Boolean,
+ dense: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ filter: (null as any) as PropValidator,
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hideSelected: Boolean,
+ hint: String,
+ itemAvatar: [String, Array, Function],
+ itemDisabled: [String, Array, Function],
+ itemText: [String, Array, Function],
+ itemValue: [String, Array, Function],
+ items: Array,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ menuProps: [String, Array, Object],
+ messages: [String, Array],
+ multiple: Boolean,
+ noDataText: String,
+ openOnClear: Boolean,
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ returnObject: Boolean,
+ reverse: Boolean,
+ rules: Array,
+ searchInput: (null as any) as PropValidator,
+ singleLine: Boolean,
+ smallChips: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-slider', {
+ props: {
+ alwaysDirty: Boolean,
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ inverseLabel: Boolean,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ max: [Number, String],
+ messages: [String, Array],
+ min: [Number, String],
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ rules: Array,
+ step: [Number, String],
+ success: Boolean,
+ successMessages: [String, Array],
+ thumbColor: String,
+ thumbLabel: [Boolean, String],
+ thumbSize: [Number, String],
+ tickLabels: Array,
+ tickSize: [Number, String],
+ ticks: [Boolean, String],
+ trackColor: String,
+ validateOnBlur: Boolean,
+ value: [Number, String],
+ },
+});
+Vue.component('v-snackbar', {
+ props: {
+ absolute: Boolean,
+ autoHeight: Boolean,
+ bottom: Boolean,
+ color: String,
+ left: Boolean,
+ multiLine: Boolean,
+ right: Boolean,
+ timeout: Number,
+ top: Boolean,
+ value: (null as any) as PropValidator,
+ vertical: Boolean,
+ },
+});
+Vue.component('v-sparkline', {
+ props: {
+ autoDraw: Boolean,
+ autoDrawDuration: Number,
+ autoDrawEasing: String,
+ data: Array,
+ gradient: Array,
+ gradientDirection: String,
+ height: Number,
+ lineWidth: Number,
+ padding: Number,
+ showLabel: Boolean,
+ smooth: [Boolean, Number],
+ width: Number,
+ },
+});
+Vue.component('v-speed-dial', {
+ props: {
+ absolute: Boolean,
+ bottom: Boolean,
+ direction: String,
+ fixed: Boolean,
+ left: Boolean,
+ mode: String,
+ openOnHover: Boolean,
+ origin: String,
+ right: Boolean,
+ top: Boolean,
+ transition: String,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-stepper', {
+ props: {
+ altLabels: Boolean,
+ dark: Boolean,
+ light: Boolean,
+ nonLinear: Boolean,
+ value: [Number, String],
+ vertical: Boolean,
+ },
+});
+Vue.component('v-stepper-content', {
+ props: {
+ step: [Number, String],
+ },
+});
+Vue.component('v-stepper-step', {
+ props: {
+ color: String,
+ complete: Boolean,
+ completeIcon: String,
+ editIcon: String,
+ editable: Boolean,
+ errorIcon: String,
+ rules: Array,
+ step: [Number, String],
+ },
+});
+Vue.component('v-stepper-header', {});
+Vue.component('v-stepper-items', {});
+Vue.component('v-subheader', {
+ props: {
+ dark: Boolean,
+ inset: Boolean,
+ light: Boolean,
+ },
+});
+Vue.component('v-switch', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ backgroundColor: String,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ falseValue: (null as any) as PropValidator,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ id: String,
+ inputValue: (null as any) as PropValidator,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ messages: [String, Array],
+ multiple: Boolean,
+ persistentHint: Boolean,
+ prependIcon: String,
+ prependIconCb: Function,
+ readonly: Boolean,
+ ripple: [Boolean, Object],
+ rules: Array,
+ success: Boolean,
+ successMessages: [String, Array],
+ trueValue: (null as any) as PropValidator,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ valueComparator: Function,
+ },
+});
+Vue.component('v-system-bar', {
+ props: {
+ absolute: Boolean,
+ app: Boolean,
+ color: String,
+ dark: Boolean,
+ fixed: Boolean,
+ height: [Number, String],
+ light: Boolean,
+ lightsOut: Boolean,
+ status: Boolean,
+ window: Boolean,
+ },
+});
+Vue.component('v-tabs', {
+ props: {
+ activeClass: String,
+ alignWithTitle: Boolean,
+ centered: Boolean,
+ color: String,
+ dark: Boolean,
+ fixedTabs: Boolean,
+ grow: Boolean,
+ height: [Number, String],
+ hideSlider: Boolean,
+ iconsAndText: Boolean,
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ mobileBreakPoint: [Number, String],
+ multiple: Boolean,
+ nextIcon: String,
+ prevIcon: String,
+ right: Boolean,
+ showArrows: Boolean,
+ sliderColor: String,
+ value: [Number, String],
+ },
+});
+Vue.component('v-tab', {
+ props: {
+ activeClass: String,
+ append: Boolean,
+ dark: Boolean,
+ disabled: Boolean,
+ exact: Boolean,
+ exactActiveClass: String,
+ href: [String, Object],
+ light: Boolean,
+ nuxt: Boolean,
+ replace: Boolean,
+ ripple: [Boolean, Object],
+ tag: String,
+ target: String,
+ to: [String, Object],
+ },
+});
+Vue.component('v-tab-item', {
+ props: {
+ activeClass: String,
+ disabled: Boolean,
+ id: String,
+ lazy: Boolean,
+ reverseTransition: [Boolean, String],
+ transition: [Boolean, String],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-tabs-items', {
+ props: {
+ activeClass: String,
+ cycle: Boolean,
+ dark: Boolean,
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ multiple: Boolean,
+ reverse: Boolean,
+ touch: Object,
+ touchless: Boolean,
+ value: (null as any) as PropValidator,
+ vertical: Boolean,
+ },
+});
+Vue.component('v-tabs-slider', {
+ props: {
+ color: String,
+ },
+});
+Vue.component('v-textarea', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ autoGrow: Boolean,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ messages: [String, Array],
+ noResize: Boolean,
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ reverse: Boolean,
+ rowHeight: [Number, String],
+ rows: [Number, String],
+ rules: Array,
+ singleLine: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-text-field', {
+ props: {
+ appendIcon: String,
+ appendIconCb: Function,
+ appendOuterIcon: String,
+ appendOuterIconCb: Function,
+ autofocus: Boolean,
+ backgroundColor: String,
+ box: Boolean,
+ browserAutocomplete: String,
+ clearIcon: String,
+ clearIconCb: Function,
+ clearable: Boolean,
+ color: String,
+ counter: [Boolean, Number, String],
+ dark: Boolean,
+ disabled: Boolean,
+ dontFillMaskBlanks: Boolean,
+ error: Boolean,
+ errorCount: [Number, String],
+ errorMessages: [String, Array],
+ flat: Boolean,
+ fullWidth: Boolean,
+ height: [Number, String],
+ hideDetails: Boolean,
+ hint: String,
+ label: String,
+ light: Boolean,
+ loading: [Boolean, String],
+ mask: [Object, String],
+ messages: [String, Array],
+ outline: Boolean,
+ persistentHint: Boolean,
+ placeholder: String,
+ prefix: String,
+ prependIcon: String,
+ prependIconCb: Function,
+ prependInnerIcon: String,
+ prependInnerIconCb: Function,
+ readonly: Boolean,
+ returnMaskedValue: Boolean,
+ reverse: Boolean,
+ rules: Array,
+ singleLine: Boolean,
+ solo: Boolean,
+ soloInverted: Boolean,
+ success: Boolean,
+ successMessages: [String, Array],
+ suffix: String,
+ type: String,
+ validateOnBlur: Boolean,
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-timeline', {
+ props: {
+ alignTop: Boolean,
+ dark: Boolean,
+ dense: Boolean,
+ light: Boolean,
+ },
+});
+Vue.component('v-timeline-item', {
+ props: {
+ color: String,
+ dark: Boolean,
+ fillDot: Boolean,
+ hideDot: Boolean,
+ icon: String,
+ iconColor: String,
+ large: Boolean,
+ left: Boolean,
+ light: Boolean,
+ right: Boolean,
+ small: Boolean,
+ },
+});
+Vue.component('v-time-picker', {
+ props: {
+ allowedHours: Function,
+ allowedMinutes: Function,
+ allowedSeconds: Function,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ format: String,
+ fullWidth: Boolean,
+ headerColor: String,
+ landscape: Boolean,
+ light: Boolean,
+ max: String,
+ min: String,
+ noTitle: Boolean,
+ readonly: Boolean,
+ scrollable: Boolean,
+ useSeconds: Boolean,
+ value: (null as any) as PropValidator,
+ width: [Number, String],
+ },
+});
+Vue.component('v-time-picker-clock', {
+ props: {
+ allowedValues: Function,
+ color: String,
+ dark: Boolean,
+ disabled: Boolean,
+ double: Boolean,
+ format: Function,
+ light: Boolean,
+ max: Number,
+ min: Number,
+ readonly: Boolean,
+ rotate: Number,
+ scrollable: Boolean,
+ step: Number,
+ value: Number,
+ },
+});
+Vue.component('v-time-picker-title', {
+ props: {
+ ampm: Boolean,
+ color: String,
+ disabled: Boolean,
+ hour: Number,
+ minute: Number,
+ period: String,
+ readonly: Boolean,
+ second: Number,
+ selecting: Number,
+ useSeconds: Boolean,
+ },
+});
+Vue.component('v-toolbar', {
+ props: {
+ absolute: Boolean,
+ app: Boolean,
+ card: Boolean,
+ clippedLeft: Boolean,
+ clippedRight: Boolean,
+ color: String,
+ dark: Boolean,
+ dense: Boolean,
+ extended: Boolean,
+ extensionHeight: [Number, String],
+ fixed: Boolean,
+ flat: Boolean,
+ floating: Boolean,
+ height: [Number, String],
+ invertedScroll: Boolean,
+ light: Boolean,
+ manualScroll: Boolean,
+ prominent: Boolean,
+ scrollOffScreen: Boolean,
+ scrollTarget: String,
+ scrollThreshold: Number,
+ scrollToolbarOffScreen: Boolean,
+ tabs: Boolean,
+ },
+});
+Vue.component('v-toolbar-side-icon', {});
+Vue.component('v-toolbar-title', {});
+Vue.component('v-toolbar-items', {});
+Vue.component('v-tooltip', {
+ props: {
+ absolute: Boolean,
+ activator: (null as any) as PropValidator,
+ allowOverflow: Boolean,
+ attach: (null as any) as PropValidator,
+ bottom: Boolean,
+ closeDelay: [Number, String],
+ color: String,
+ contentClass: (null as any) as PropValidator,
+ dark: Boolean,
+ debounce: [Number, String],
+ disabled: Boolean,
+ fixed: Boolean,
+ inputActivator: Boolean,
+ lazy: Boolean,
+ left: Boolean,
+ light: Boolean,
+ maxWidth: [Number, String],
+ minWidth: [Number, String],
+ nudgeBottom: [Number, String],
+ nudgeLeft: [Number, String],
+ nudgeRight: [Number, String],
+ nudgeTop: [Number, String],
+ nudgeWidth: [Number, String],
+ offsetOverflow: Boolean,
+ openDelay: [Number, String],
+ positionX: Number,
+ positionY: Number,
+ right: Boolean,
+ tag: String,
+ top: Boolean,
+ transition: String,
+ value: (null as any) as PropValidator,
+ zIndex: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-treeview', {
+ props: {
+ activatable: Boolean,
+ active: Array,
+ activeClass: String,
+ dark: Boolean,
+ expandIcon: String,
+ hoverable: Boolean,
+ indeterminateIcon: String,
+ itemChildren: String,
+ itemKey: String,
+ itemText: String,
+ items: Array,
+ light: Boolean,
+ loadChildren: Function,
+ loadingIcon: String,
+ multipleActive: Boolean,
+ offIcon: String,
+ onIcon: String,
+ open: Array,
+ openAll: Boolean,
+ openOnClick: Boolean,
+ selectable: Boolean,
+ selectedColor: String,
+ transition: Boolean,
+ value: Array,
+ },
+});
+Vue.component('v-treeview-node', {
+ props: {
+ activatable: Boolean,
+ activeClass: String,
+ expandIcon: String,
+ indeterminateIcon: String,
+ item: Object,
+ itemChildren: String,
+ itemKey: String,
+ itemText: String,
+ loadChildren: Function,
+ loadingIcon: String,
+ offIcon: String,
+ onIcon: String,
+ openOnClick: Boolean,
+ selectable: Boolean,
+ selectedColor: String,
+ transition: Boolean,
+ },
+});
+Vue.component('v-window', {
+ props: {
+ activeClass: String,
+ dark: Boolean,
+ light: Boolean,
+ mandatory: Boolean,
+ max: [Number, String],
+ multiple: Boolean,
+ reverse: Boolean,
+ touch: Object,
+ touchless: Boolean,
+ value: (null as any) as PropValidator,
+ vertical: Boolean,
+ },
+});
+Vue.component('v-window-item', {
+ props: {
+ activeClass: String,
+ disabled: Boolean,
+ lazy: Boolean,
+ reverseTransition: [Boolean, String],
+ transition: [Boolean, String],
+ value: (null as any) as PropValidator,
+ },
+});
+Vue.component('v-bottom-sheet-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-carousel-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-carousel-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-tab-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-tab-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-menu-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-fab-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-dialog-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-dialog-bottom-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-fade-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-scale-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-scroll-x-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-scroll-x-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-scroll-y-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-scroll-y-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-slide-x-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-slide-x-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-slide-y-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-slide-y-reverse-transition', {
+ props: {
+ group: Boolean,
+ hideOnLeave: Boolean,
+ leaveAbsolute: Boolean,
+ mode: String,
+ origin: String,
+ },
+});
+Vue.component('v-expand-transition', {
+ props: {
+ mode: String,
+ },
+});
+Vue.component('v-row-expand-transition', {
+ props: {
+ mode: String,
+ },
+});
diff --git a/src/frontend/src/util.ts b/src/frontend/src/util.ts
new file mode 100644
index 0000000..c69894c
--- /dev/null
+++ b/src/frontend/src/util.ts
@@ -0,0 +1,142 @@
+import axios, { AxiosError, AxiosResponse } from 'axios';
+import { DynamicInput } from './model';
+
+const baseUrl = `${window.location.protocol}//${window.location.hostname}:8081`;
+const root = `${baseUrl}/braze/api/`;
+const constants = `${root}constants`;
+const mods = `${root}mods`;
+const packs = `${root}packs`;
+const latency = 1600; // artifical latency
+
+type HttpSuccessHandler = (response: AxiosResponse) => void;
+type HttpErrorHandler = (error: AxiosError) => void;
+
+if (baseUrl !== window.location.origin) {
+ // for dev environment
+ axios.defaults.headers.common.Authorization = 'Basic dXNlcjpjaGFuZ2VtZQ==';
+}
+
+function loadAndThen(cb: Function): void {
+ setTimeout(cb, latency);
+}
+
+function get(
+ url: string,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ loadAndThen(() =>
+ axios
+ .get(url)
+ .then(success)
+ .catch(error)
+ );
+}
+
+function post(
+ url: string,
+ data: U,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ loadAndThen(() =>
+ axios
+ .post(url, data)
+ .then(success)
+ .catch(error)
+ );
+}
+
+export function getConstants(
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ get(constants, success, error);
+}
+
+export function getMods(
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ get(mods, success, error);
+}
+
+export function getMod(
+ slug: string,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ get(`${mods}/${slug}`, success, error);
+}
+
+export function getPack(
+ slug: string,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ get(`${packs}/${slug}`, success, error);
+}
+
+export function getPacks(
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ get(packs, success, error);
+}
+
+export function postMod(
+ data: SimpleMod,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ post(mods, data, success, error);
+}
+
+export function postModVersion(
+ slug: string,
+ data: IndexedModVersion,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ post(`${mods}/${slug}`, data, success, error);
+}
+
+export function postPack(
+ data: SimplePack,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ post(packs, data, success, error);
+}
+
+export function postPackVersion(
+ slug: string,
+ data: IndexedPackVersion,
+ success: HttpSuccessHandler,
+ error: HttpErrorHandler
+): void {
+ post(`${packs}/${slug}`, data, success, error);
+}
+
+export function inputsToObject<
+ T extends { [K in DynamicInput['key']]: string | null }
+>(inputs: DynamicInput[]): T {
+ return inputs.reduce((acc: Partial, input) => {
+ acc[input.key] = input.value;
+ return acc;
+ }, {}) as T;
+}
+
+// https://stackoverflow.com/a/46941824/2172566
+export type Overwrite = { [P in Exclude]: T1[P] } &
+ T2;
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function slugify(str: string): string {
+ return str
+ .toLowerCase()
+ .replace(/[^\w\s-]/g, '') // remove non-word [a-z0-9_], non-whitespace, non-hyphen characters
+ .replace(/[\s_-]+/g, '-') // swap any length of whitespace, underscore, hyphen characters with a single -
+ .replace(/^-+|-+$/g, ''); // remove leading, trailing -
+ // function written by kganser https://gist.github.com/mathewbyrne/1280286#gistcomment-1716050
+}
diff --git a/src/frontend/test/e2e/specs/test.js b/src/frontend/test/e2e/specs/test.js
index a7b1bd9..2e5bf3a 100644
--- a/src/frontend/test/e2e/specs/test.js
+++ b/src/frontend/test/e2e/specs/test.js
@@ -3,7 +3,7 @@
module.exports = {
'default e2e tests': function (browser) {
- // automatically uses dev Server port from /config.index.js
+ // automatically uses dev Server port from /config.index.ts
// default: http://localhost:8080
// see nightwatch.conf.js
const devServer = browser.globals.devServerURL
diff --git a/src/frontend/test/unit/jest.conf.js b/src/frontend/test/unit/jest.conf.js
index 4f7da15..2f0b7f7 100644
--- a/src/frontend/test/unit/jest.conf.js
+++ b/src/frontend/test/unit/jest.conf.js
@@ -22,9 +22,9 @@ module.exports = {
mapCoverage: true,
coverageDirectory: '/test/unit/coverage',
collectCoverageFrom: [
- 'src/**/*.{js,vue}',
- '!src/main.js',
- '!src/router/index.js',
+ 'src/**/*.{ts,js,vue}',
+ '!src/main.ts',
+ '!src/router/index.ts',
'!**/node_modules/**'
]
}
diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json
new file mode 100644
index 0000000..d6fdb0a
--- /dev/null
+++ b/src/frontend/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "lib": ["dom", "es5", "es2015", "esnext.array"],
+ "module": "es2015",
+ "target": "es5",
+ "strict": true,
+ "sourceMap": true,
+ "outDir": "./built/",
+ "moduleResolution": "node",
+ "allowSyntheticDefaultImports": true,
+ "experimentalDecorators": true
+ },
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/src/main/kotlin/com/forresthopkinsa/braze/model/TypeDefGenerator.kt b/src/main/kotlin/com/forresthopkinsa/braze/model/TypeDefGenerator.kt
new file mode 100644
index 0000000..51d3218
--- /dev/null
+++ b/src/main/kotlin/com/forresthopkinsa/braze/model/TypeDefGenerator.kt
@@ -0,0 +1,30 @@
+package com.forresthopkinsa.braze.model
+
+import com.forresthopkinsa.braze.spring.RestController
+import me.ntrrgc.tsGenerator.TypeScriptGenerator
+
+fun main() {
+ val classes = setOf(
+ RestController.Constants::class,
+ ForgeVersion::class,
+ GameVersion::class,
+ JavaVersion::class,
+ Mod::class,
+ SimpleMod::class,
+ ModVersion::class,
+ IndexedModVersion::class,
+ Pack::class,
+ SimplePack::class,
+ PackVersion::class,
+ IndexedPackVersion::class
+ )
+ val ignored = setOf(
+ Element::class,
+ SimpleElement::class,
+ Version::class,
+ IndexedVersion::class,
+ Data::class
+ )
+ val definitions = TypeScriptGenerator(rootClasses = classes, ignoreSuperclasses = ignored).definitionsText
+ println(definitions)
+}
\ No newline at end of file
|