2023-06-14 15:23:13 +00:00
|
|
|
import { createApp, ref } from 'vue'
|
2023-06-13 15:09:25 +00:00
|
|
|
import { createStore } from 'vuex'
|
2023-07-09 17:32:25 +00:00
|
|
|
import axios from "axios";
|
2023-05-02 20:53:27 +00:00
|
|
|
import App from './App.vue'
|
|
|
|
import router from './router'
|
|
|
|
|
|
|
|
import './assets/tailwind.css'
|
|
|
|
|
|
|
|
const app = createApp(App)
|
2023-07-09 17:32:25 +00:00
|
|
|
console.log("Loaded main.js")
|
2023-05-02 20:53:27 +00:00
|
|
|
|
2023-09-29 17:31:20 +00:00
|
|
|
function copyObject(obj) {
|
|
|
|
const copy = {};
|
|
|
|
for (const key in obj) {
|
|
|
|
if (obj.hasOwnProperty(key)) {
|
|
|
|
copy[key] = obj[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return copy;
|
|
|
|
}
|
|
|
|
|
2023-06-13 15:09:25 +00:00
|
|
|
// Create a new store instance.
|
2023-07-06 17:19:48 +00:00
|
|
|
export const store = createStore({
|
2023-06-13 15:09:25 +00:00
|
|
|
state () {
|
|
|
|
return {
|
2023-06-17 10:53:40 +00:00
|
|
|
// count: 0,
|
2023-07-10 20:01:20 +00:00
|
|
|
ready:false,
|
2023-09-02 18:37:06 +00:00
|
|
|
version : "unknown",
|
2023-07-06 11:47:23 +00:00
|
|
|
settingsChanged:false,
|
|
|
|
isConnected: false, // Add the isConnected property
|
2023-07-09 17:32:25 +00:00
|
|
|
config:null,
|
|
|
|
mountedPers:null,
|
2023-07-10 22:45:47 +00:00
|
|
|
mountedPersArr:null,
|
2023-07-10 20:01:20 +00:00
|
|
|
bindingsArr:null,
|
|
|
|
modelsArr:null,
|
2023-09-05 22:57:23 +00:00
|
|
|
selectedModel:null,
|
2023-07-09 17:32:25 +00:00
|
|
|
personalities:null,
|
2023-07-10 20:01:20 +00:00
|
|
|
diskUsage:null,
|
|
|
|
ramUsage:null,
|
|
|
|
vramUsage:null,
|
2023-07-20 09:44:33 +00:00
|
|
|
extensionsZoo:null,
|
2023-10-02 23:13:02 +00:00
|
|
|
activeExtensions:null,
|
2023-06-13 15:09:25 +00:00
|
|
|
}
|
|
|
|
},
|
2023-10-02 00:18:57 +00:00
|
|
|
mutations: {
|
|
|
|
setIsReady(state, ready) {
|
|
|
|
state.ready = ready;
|
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
setIsConnected(state, isConnected) {
|
|
|
|
state.isConnected = isConnected;
|
|
|
|
},
|
2023-07-09 17:32:25 +00:00
|
|
|
setConfig(state, config) {
|
|
|
|
state.config = config;
|
|
|
|
},
|
|
|
|
setPersonalities(state, personalities) {
|
|
|
|
state.personalities = personalities;
|
|
|
|
},
|
|
|
|
setMountedPers(state, mountedPers) {
|
|
|
|
state.mountedPers = mountedPers;
|
|
|
|
},
|
2023-07-10 22:45:47 +00:00
|
|
|
setMountedPersArr(state, mountedPersArr) {
|
|
|
|
state.mountedPersArr = mountedPersArr;
|
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
setBindingsArr(state, bindingsArr) {
|
|
|
|
state.bindingsArr = bindingsArr;
|
|
|
|
},
|
|
|
|
setModelsArr(state, modelsArr) {
|
|
|
|
state.modelsArr = modelsArr;
|
|
|
|
},
|
2023-09-05 22:57:23 +00:00
|
|
|
setselectedModel(state, selectedModel) {
|
|
|
|
state.selectedModel = selectedModel;
|
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
setDiskUsage(state, diskUsage) {
|
|
|
|
state.diskUsage = diskUsage;
|
|
|
|
},
|
|
|
|
setRamUsage(state, ramUsage) {
|
|
|
|
state.ramUsage = ramUsage;
|
|
|
|
},
|
|
|
|
setVramUsage(state, vramUsage) {
|
|
|
|
state.vramUsage = vramUsage;
|
|
|
|
},
|
|
|
|
|
2023-10-02 23:13:02 +00:00
|
|
|
setActiveExtensions(state, activeExtensions) {
|
|
|
|
state.activeExtensions = activeExtensions;
|
|
|
|
},
|
2023-07-20 09:44:33 +00:00
|
|
|
setExtensionsZoo(state, extensionsZoo) {
|
|
|
|
state.extensionsZoo = extensionsZoo;
|
|
|
|
},
|
2023-06-17 10:53:40 +00:00
|
|
|
// increment (state) {
|
|
|
|
// state.count++
|
2023-07-06 17:19:48 +00:00
|
|
|
// }
|
2023-07-09 17:32:25 +00:00
|
|
|
},
|
|
|
|
getters: {
|
2023-07-10 20:01:20 +00:00
|
|
|
getIsConnected(state) {
|
|
|
|
return state.isConnected
|
|
|
|
},
|
2023-07-09 17:32:25 +00:00
|
|
|
getConfig(state) {
|
|
|
|
return state.config
|
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
getPersonalities(state) {
|
|
|
|
return state.personalities;
|
2023-07-09 17:32:25 +00:00
|
|
|
},
|
2023-07-10 22:45:47 +00:00
|
|
|
getMountedPersArr(state) {
|
|
|
|
return state.mountedPersArr;
|
|
|
|
},
|
2023-07-09 17:32:25 +00:00
|
|
|
getMountedPers(state) {
|
|
|
|
return state.mountedPers;
|
2023-07-10 20:01:20 +00:00
|
|
|
},
|
|
|
|
getbindingsArr(state) {
|
|
|
|
return state.bindingsArr;
|
|
|
|
},
|
|
|
|
getModelsArr(state) {
|
|
|
|
return state.modelsArr;
|
|
|
|
},
|
|
|
|
getDiskUsage(state) {
|
|
|
|
return state.diskUsage;
|
|
|
|
},
|
|
|
|
getRamUsage(state) {
|
|
|
|
return state.ramUsage;
|
|
|
|
},
|
|
|
|
getVramUsage(state) {
|
|
|
|
return state.vramUsage;
|
|
|
|
},
|
2023-10-02 23:13:02 +00:00
|
|
|
|
|
|
|
getActiveExtensions(state) {
|
|
|
|
return state.activeExtensions;
|
|
|
|
},
|
2023-07-20 09:44:33 +00:00
|
|
|
getExtensionsZoo(state) {
|
|
|
|
return state.extensionsZoo;
|
|
|
|
},
|
2023-07-09 17:32:25 +00:00
|
|
|
},
|
|
|
|
actions: {
|
2023-09-02 18:37:06 +00:00
|
|
|
async getVersion(){
|
|
|
|
let res = await axios.get('/get_lollms_webui_version', {});
|
|
|
|
if (res) {
|
|
|
|
this.state.version = res.data.version
|
|
|
|
}
|
|
|
|
},
|
2023-07-09 17:32:25 +00:00
|
|
|
async refreshConfig({ commit }) {
|
|
|
|
console.log("Fetching configuration");
|
|
|
|
try {
|
2023-07-10 22:45:47 +00:00
|
|
|
const configFile = await api_get_req('get_config')
|
2023-09-19 00:33:16 +00:00
|
|
|
if(configFile.active_personality_id<0){
|
|
|
|
configFile.active_personality_id=0;
|
|
|
|
}
|
2023-07-10 22:45:47 +00:00
|
|
|
let personality_path_infos = configFile.personalities[configFile.active_personality_id].split("/")
|
|
|
|
//let personality_path_infos = await this.api_get_req("get_current_personality_path_infos")
|
2023-08-17 23:29:53 +00:00
|
|
|
configFile.personality_category = personality_path_infos[0]
|
|
|
|
configFile.personality_folder = personality_path_infos[1]
|
2023-08-25 19:47:28 +00:00
|
|
|
console.log("Recovered config")
|
|
|
|
console.log(configFile)
|
2023-09-19 00:33:16 +00:00
|
|
|
console.log("Committing config");
|
|
|
|
console.log(configFile)
|
|
|
|
console.log(this.state.config)
|
2023-07-09 17:32:25 +00:00
|
|
|
commit('setConfig', configFile);
|
|
|
|
} catch (error) {
|
|
|
|
console.log(error.message, 'refreshConfig');
|
|
|
|
// Handle error
|
|
|
|
}
|
|
|
|
},
|
2023-09-29 17:31:20 +00:00
|
|
|
async refreshPersonalitiesZoo({ commit }) {
|
2023-07-09 17:32:25 +00:00
|
|
|
let personalities = []
|
2023-08-17 23:29:53 +00:00
|
|
|
const catdictionary = await api_get_req("get_all_personalities")
|
|
|
|
const catkeys = Object.keys(catdictionary); // returns categories
|
2023-08-25 19:47:28 +00:00
|
|
|
console.log("Personalities recovered:"+this.state.config.personalities)
|
2023-07-09 17:32:25 +00:00
|
|
|
|
2023-08-17 23:29:53 +00:00
|
|
|
for (let j = 0; j < catkeys.length; j++) {
|
|
|
|
const catkey = catkeys[j];
|
|
|
|
const personalitiesArray = catdictionary[catkey];
|
|
|
|
const modPersArr = personalitiesArray.map((item) => {
|
2023-09-19 00:33:16 +00:00
|
|
|
let isMounted = false;
|
|
|
|
|
|
|
|
for(const personality of this.state.config.personalities){
|
|
|
|
if(personality.includes(catkey + '/' + item.folder)){
|
|
|
|
isMounted = true;
|
|
|
|
if(personality.includes(":")){
|
|
|
|
const parts = personality.split(':');
|
|
|
|
item.language = parts[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-08-17 23:29:53 +00:00
|
|
|
// if (isMounted) {
|
|
|
|
// console.log(item)
|
|
|
|
// }
|
|
|
|
let newItem = {}
|
|
|
|
newItem = item
|
|
|
|
newItem.category = catkey // add new props to items
|
|
|
|
newItem.full_path = catkey + '/' + item.folder // add new props to items
|
|
|
|
newItem.isMounted = isMounted // add new props to items
|
|
|
|
return newItem
|
|
|
|
})
|
2023-07-09 17:32:25 +00:00
|
|
|
|
|
|
|
|
2023-08-17 23:29:53 +00:00
|
|
|
if (personalities.length == 0) {
|
|
|
|
personalities = modPersArr
|
|
|
|
} else {
|
|
|
|
personalities = personalities.concat(modPersArr)
|
2023-07-09 17:32:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
personalities.sort((a, b) => a.name.localeCompare(b.name))
|
2023-07-15 21:06:27 +00:00
|
|
|
|
2023-07-10 20:01:20 +00:00
|
|
|
commit('setPersonalities', personalities);
|
2023-07-09 17:32:25 +00:00
|
|
|
|
2023-07-10 20:01:20 +00:00
|
|
|
console.log("Done loading personalities")
|
2023-07-09 17:32:25 +00:00
|
|
|
},
|
|
|
|
refreshMountedPersonalities({ commit }) {
|
2023-09-19 00:33:16 +00:00
|
|
|
if(this.state.config.active_personality_id<0){
|
|
|
|
this.state.config.active_personality_id=0;
|
|
|
|
}
|
2023-09-28 13:56:41 +00:00
|
|
|
let mountedPersArr = []
|
|
|
|
// console.log('perrs listo',this.state.personalities)
|
2023-10-02 00:18:57 +00:00
|
|
|
const indicesToRemove = [];
|
2023-09-28 13:56:41 +00:00
|
|
|
for (let i = 0; i < this.state.config.personalities.length; i++) {
|
|
|
|
const full_path_item = this.state.config.personalities[i]
|
2023-09-29 17:31:20 +00:00
|
|
|
const parts = full_path_item.split(':')
|
|
|
|
const index = this.state.personalities.findIndex(item => item.full_path == full_path_item || item.full_path == parts[0])
|
2023-09-28 13:56:41 +00:00
|
|
|
if(index>=0){
|
2023-09-29 17:31:20 +00:00
|
|
|
let pers = copyObject(this.state.personalities[index])
|
|
|
|
if(parts.length>0){
|
|
|
|
pers.language = parts[1]
|
|
|
|
}
|
2023-09-19 00:33:16 +00:00
|
|
|
// console.log(`Personality : ${JSON.stringify(pers)}`)
|
2023-07-09 17:32:25 +00:00
|
|
|
if (pers) {
|
|
|
|
mountedPersArr.push(pers)
|
|
|
|
}
|
|
|
|
else {
|
2023-08-25 19:47:28 +00:00
|
|
|
mountedPersArr.push(this.state.personalities[this.state.personalities.findIndex(item => item.full_path == "generic/lollms")])
|
2023-07-09 17:32:25 +00:00
|
|
|
}
|
2023-09-28 13:56:41 +00:00
|
|
|
}
|
|
|
|
else{
|
2023-10-02 00:18:57 +00:00
|
|
|
indicesToRemove.push(i)
|
2023-09-28 13:56:41 +00:00
|
|
|
console.log("Couldn't load personality : ",full_path_item)
|
|
|
|
}
|
|
|
|
}
|
2023-10-02 00:18:57 +00:00
|
|
|
// Remove the broken personalities using the collected indices
|
|
|
|
for (let i = indicesToRemove.length - 1; i >= 0; i--) {
|
|
|
|
console.log("Removing personality : ",this.state.config.personalities[indicesToRemove[i]])
|
|
|
|
this.state.config.personalities.splice(indicesToRemove[i], 1);
|
|
|
|
|
|
|
|
if(this.state.config.active_personality_id>indicesToRemove[i]){
|
|
|
|
this.state.config.active_personality_id -= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-28 13:56:41 +00:00
|
|
|
commit('setMountedPersArr', mountedPersArr);
|
|
|
|
|
|
|
|
this.state.mountedPers = this.state.personalities[this.state.personalities.findIndex(item => item.full_path == this.state.config.personalities[this.state.config.active_personality_id] || item.full_path+':'+item.language ==this.state.config.personalities[this.state.config.active_personality_id])]
|
|
|
|
// console.log(`${this.state.config.personalities[this.state.config.active_personality_id]}`)
|
|
|
|
// console.log(`Mounted personality: ${this.state.mountedPers}`)
|
2023-07-09 17:32:25 +00:00
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
async refreshBindings({ commit }) {
|
|
|
|
let bindingsArr = await api_get_req("list_bindings")
|
|
|
|
commit('setBindingsArr',bindingsArr)
|
|
|
|
},
|
|
|
|
async refreshModels({ commit }) {
|
2023-09-21 01:39:25 +00:00
|
|
|
console.log("Fetching models")
|
2023-09-05 22:57:23 +00:00
|
|
|
let modelsArr = await api_get_req("list_models");
|
2023-09-21 01:39:25 +00:00
|
|
|
console.log(`Found ${modelsArr}`)
|
2023-09-05 22:57:23 +00:00
|
|
|
let selectedModel = await api_get_req('get_active_model');
|
|
|
|
if(selectedModel!=undefined){
|
|
|
|
commit('setselectedModel',selectedModel["model"])
|
|
|
|
}
|
|
|
|
|
2023-07-10 20:01:20 +00:00
|
|
|
commit('setModelsArr',modelsArr)
|
|
|
|
},
|
2023-07-20 09:44:33 +00:00
|
|
|
async refreshExtensionsZoo({ commit }) {
|
2023-10-02 23:13:02 +00:00
|
|
|
let extensions = []
|
|
|
|
let catdictionary = await api_get_req("list_extensions")
|
|
|
|
const catkeys = Object.keys(catdictionary); // returns categories
|
|
|
|
console.log("Extensions recovered:"+this.state.config.extensions)
|
|
|
|
|
|
|
|
for (let j = 0; j < catkeys.length; j++) {
|
|
|
|
const catkey = catkeys[j];
|
|
|
|
const extensionsArray = catdictionary[catkey];
|
|
|
|
const modExtArr = extensionsArray.map((item) => {
|
|
|
|
let isMounted = false;
|
|
|
|
|
|
|
|
for(const extension of this.state.config.personalities){
|
|
|
|
if(extension.includes(catkey + '/' + item.folder)){
|
|
|
|
isMounted = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// if (isMounted) {
|
|
|
|
// console.log(item)
|
|
|
|
// }
|
|
|
|
let newItem = {}
|
|
|
|
newItem = item
|
|
|
|
newItem.category = catkey // add new props to items
|
|
|
|
newItem.full_path = catkey + '/' + item.folder // add new props to items
|
|
|
|
newItem.isMounted = isMounted // add new props to items
|
|
|
|
return newItem
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if (extensions.length == 0) {
|
|
|
|
extensions = modExtArr
|
|
|
|
} else {
|
|
|
|
extensions = extensions.concat(modExtArr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extensions.sort((a, b) => a.name.localeCompare(b.name))
|
|
|
|
|
|
|
|
commit('setActiveExtensions', this.state.config.extensions);
|
|
|
|
|
|
|
|
console.log("Done loading extensions")
|
|
|
|
|
|
|
|
commit('setExtensionsZoo',extensions)
|
2023-07-20 09:44:33 +00:00
|
|
|
},
|
2023-07-10 20:01:20 +00:00
|
|
|
|
|
|
|
async refreshDiskUsage({ commit }) {
|
|
|
|
this.state.diskUsage = await api_get_req("disk_usage")
|
|
|
|
},
|
|
|
|
async refreshRamUsage({ commit }) {
|
|
|
|
this.state.ramUsage = await api_get_req("ram_usage")
|
|
|
|
},
|
|
|
|
async refreshVramUsage({ commit }) {
|
|
|
|
const resp = await api_get_req("vram_usage")
|
|
|
|
// {
|
|
|
|
// "gpu_0_total_vram": 11811160064,
|
|
|
|
// "gpu_0_used_vram": 3177185280,
|
|
|
|
// "nb_gpus": 1
|
|
|
|
// }
|
|
|
|
|
|
|
|
const gpuArr = []
|
|
|
|
|
|
|
|
if (resp.nb_gpus > 0) {
|
|
|
|
// Get keys
|
|
|
|
const keys = Object.keys(resp)
|
|
|
|
// for each gpu
|
|
|
|
for (let i = 0; i < resp.nb_gpus; i++) {
|
|
|
|
|
|
|
|
const total_vram = resp[`gpu_${i}_total_vram`];
|
|
|
|
const used_vram = resp[`gpu_${i}_used_vram`];
|
|
|
|
const model = resp[`gpu_${i}_model`];
|
|
|
|
const percentage = (used_vram / total_vram) * 100
|
|
|
|
const available_space = total_vram - used_vram
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gpuArr.push({
|
|
|
|
total_vram: total_vram,
|
|
|
|
used_vram: used_vram,
|
|
|
|
gpu_index: i,
|
|
|
|
gpu_model: model,
|
|
|
|
percentage: percentage.toFixed(2),
|
|
|
|
available_space: available_space
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
const result = {
|
|
|
|
|
|
|
|
"nb_gpus": resp.nb_gpus,
|
|
|
|
"gpus": gpuArr
|
|
|
|
}
|
|
|
|
console.log('gpu usage: ',result)
|
|
|
|
this.state.vramUsage = result
|
|
|
|
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
const result = {
|
|
|
|
"nb_gpus": 0,
|
|
|
|
"gpus": []
|
|
|
|
}
|
|
|
|
console.log('gpu usage: ',result)
|
|
|
|
this.state.vramUsage = result
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
2023-09-21 01:39:25 +00:00
|
|
|
|
2023-07-09 17:32:25 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
async function api_get_req(endpoint) {
|
|
|
|
try {
|
|
|
|
const res = await axios.get('/' + endpoint);
|
|
|
|
|
|
|
|
if (res) {
|
|
|
|
return res.data;
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
console.log(error.message, 'api_get_req');
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let actionsExecuted = false;
|
|
|
|
|
|
|
|
app.mixin({
|
2023-10-02 00:18:57 +00:00
|
|
|
async created() {
|
2023-07-09 17:32:25 +00:00
|
|
|
if (!actionsExecuted) {
|
|
|
|
actionsExecuted = true;
|
2023-07-10 20:01:20 +00:00
|
|
|
console.log("Calling")
|
2023-10-02 00:18:57 +00:00
|
|
|
await this.$store.dispatch('refreshConfig');
|
|
|
|
console.log("recovered config : ${}");
|
|
|
|
await this.$store.dispatch('getVersion');
|
|
|
|
console.log("recovered version");
|
|
|
|
await this.$store.dispatch('refreshBindings');
|
|
|
|
|
|
|
|
await this.$store.dispatch('refreshDiskUsage');
|
|
|
|
await this.$store.dispatch('refreshRamUsage');
|
|
|
|
await this.$store.dispatch('refreshVramUsage');
|
|
|
|
await this.$store.dispatch('refreshExtensionsZoo');
|
|
|
|
await this.$store.dispatch('refreshModels');
|
|
|
|
|
|
|
|
await this.$store.dispatch('refreshPersonalitiesZoo')
|
|
|
|
await this.$store.dispatch('refreshMountedPersonalities');
|
|
|
|
this.$store.state.ready = true;
|
|
|
|
console.log("store status = ", this.$store.state.ready);
|
|
|
|
console.log("done loading data")
|
2023-06-13 15:09:25 +00:00
|
|
|
}
|
2023-07-10 20:01:20 +00:00
|
|
|
|
|
|
|
},
|
|
|
|
beforeMount() {
|
2023-07-09 17:32:25 +00:00
|
|
|
}
|
|
|
|
})
|
2023-09-28 13:56:41 +00:00
|
|
|
|
|
|
|
function logObjectProperties(obj) {
|
|
|
|
if (typeof obj !== 'object' || obj === null) {
|
|
|
|
console.log('Invalid object');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let logString = "Object parameters and values:\n";
|
|
|
|
|
|
|
|
for (const key in obj) {
|
|
|
|
if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] !== 'function') {
|
|
|
|
logString += `${key}: ${obj[key]}\n`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(logString);
|
|
|
|
}
|
|
|
|
|
2023-10-02 23:13:02 +00:00
|
|
|
function flattenObject(obj, parentKey = "") {
|
|
|
|
let result = [];
|
|
|
|
|
|
|
|
for (const key in obj) {
|
|
|
|
if (obj.hasOwnProperty(key)) {
|
|
|
|
const newKey = parentKey ? `${parentKey}/${key}` : key;
|
|
|
|
|
|
|
|
if (typeof obj[key] === "object") {
|
|
|
|
const nestedFields = flattenObject(obj[key], newKey);
|
|
|
|
result = result.concat(nestedFields);
|
|
|
|
} else {
|
|
|
|
result.push(newKey);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-05-02 20:53:27 +00:00
|
|
|
app.use(router)
|
2023-06-13 15:09:25 +00:00
|
|
|
app.use(store)
|
2023-07-10 20:01:20 +00:00
|
|
|
app.mount('#app')
|
2023-05-02 20:53:27 +00:00
|
|
|
|
2023-10-02 23:13:02 +00:00
|
|
|
export{logObjectProperties, copyObject, flattenObject}
|