diff --git a/package.json b/package.json index ec7ceb7..def0cab 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,9 @@ "eslint-plugin-vue": "^9.0.0", "prettier": "^2.5.1", "quasar": "^2.15.2", - "typescript": "^4.5.4", + "typescript": "~5.3.0", + "vite-plugin-checker": "^0.6.4", + "vue-tsc": "^1.8.22", "workbox-build": "^7.0.0", "workbox-cacheable-response": "^7.0.0", "workbox-core": "^7.0.0", diff --git a/quasar.config.js b/quasar.config.js index 26371fe..f98860a 100644 --- a/quasar.config.js +++ b/quasar.config.js @@ -9,7 +9,6 @@ // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js const { configure } = require('quasar/wrappers'); -const path = require('path'); module.exports = configure(function (/* ctx */) { return { @@ -73,9 +72,20 @@ module.exports = configure(function (/* ctx */) { // extendViteConf (viteConf) {}, // viteVuePluginOptions: {}, - // vitePlugins: [ - // [ 'package-name', { ..options.. } ] - // ] + vitePlugins: [ + [ + 'vite-plugin-checker', + { + vueTsc: { + tsconfigPath: 'tsconfig.vue-tsc.json', + }, + eslint: { + lintCommand: 'eslint "./**/*.{js,ts,mjs,cjs,vue}"', + }, + }, + { server: false }, + ], + ], }, // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer @@ -104,7 +114,7 @@ module.exports = configure(function (/* ctx */) { // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework framework: { config: { - autoImportComponentCase: 'combined', // or 'kebab' (default) or 'combined' + autoImportComponentCase: 'kebab', // or 'kebab' (default) or 'combined' }, // iconSet: 'material-icons', // Quasar icon set diff --git a/src/App.vue b/src/App.vue index 4023881..3dd5266 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,9 +3,16 @@ diff --git a/src/boot/appwrite.ts b/src/boot/appwrite.ts index 5d0668c..f432d99 100644 --- a/src/boot/appwrite.ts +++ b/src/boot/appwrite.ts @@ -13,9 +13,10 @@ const client = new Client(); // const appDatabaseId = '654ac5044d1c446feb71'; // Private self-hosted appwrite -client - .setEndpoint(process.env.APPWRITE_API_ENDPOINT) - .setProject(process.env.APPWRITE_API_PROJECT); +if (process.env.APPWRITE_API_ENDPOINT && process.env.APPWRITE_API_PROJECT) + client + .setEndpoint(process.env.APPWRITE_API_ENDPOINT) + .setProject(process.env.APPWRITE_API_PROJECT); //TODO move this to config file const AppwriteIds = { diff --git a/src/components/ExampleComponent.vue b/src/components/ExampleComponent.vue deleted file mode 100644 index 3bfd35e..0000000 --- a/src/components/ExampleComponent.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - {{ title }} - - - {{ todo.id }} - {{ todo.content }} - - - Count: {{ todoCount }} / {{ meta.totalCount }} - Active: {{ active ? 'yes' : 'no' }} - Clicks on todos: {{ clickCount }} - - - - diff --git a/src/components/ResourceScheduleViewerComponent.vue b/src/components/ResourceScheduleViewerComponent.vue index 4a19b62..2965a02 100644 --- a/src/components/ResourceScheduleViewerComponent.vue +++ b/src/components/ResourceScheduleViewerComponent.vue @@ -116,7 +116,7 @@ import { Boat, useBoatStore } from 'src/stores/boat'; import { useScheduleStore } from 'src/stores/schedule'; import { date } from 'quasar'; import { computed } from 'vue'; -import type { StatusTypes } from 'src/stores/schedule'; +import type { StatusTypes } from 'src/stores/schedule.types'; interface EventData { event: object; @@ -172,7 +172,7 @@ function monthFormatter() { function getEvents(scope: ResourceIntervalScope) { const resourceEvents = scheduleStore.getBoatReservations( - date.extractDate(selectedDate.value, 'YYYY-MM-DD'), + parseDate(date.extractDate(selectedDate.value, 'YYYY-MM-DD')) as Timestamp, scope.resource.$id ); diff --git a/src/components/scheduling/boat/BoatScheduleTableComponent.vue b/src/components/scheduling/boat/BoatScheduleTableComponent.vue index 14bb370..839c6dc 100644 --- a/src/components/scheduling/boat/BoatScheduleTableComponent.vue +++ b/src/components/scheduling/boat/BoatScheduleTableComponent.vue @@ -15,7 +15,6 @@ :short-interval-label="true" v-model="selectedDate" :column-count="boatData.length" - @change="changeEvent" v-touch-swipe.left.right="handleSwipe" > @@ -71,15 +70,13 @@ import { parseTimestamp, parseDate, addToDate, - makeDateTime, } from '@quasar/quasar-ui-qcalendar'; import CalendarHeaderComponent from './CalendarHeaderComponent.vue'; import { ref, computed, onMounted } from 'vue'; -import { Boat, useBoatStore } from 'src/stores/boat'; +import { useBoatStore } from 'src/stores/boat'; import { useScheduleStore } from 'src/stores/schedule'; -import { Reservation, Timeblock } from 'src/stores/schedule.types'; -import { date } from 'quasar'; +import { Timeblock } from 'src/stores/schedule.types'; const scheduleStore = useScheduleStore(); const boatStore = useBoatStore(); @@ -98,18 +95,18 @@ onMounted(async () => { function handleSwipe({ ...event }) { event.direction === 'right' ? calendar.value?.prev() : calendar.value?.next(); } -function reservationStyles( - reservation: Reservation, - timeStartPos: (t: string) => string, - timeDurationHeight: (d: number) => string -) { - return genericBlockStyle( - parseDate(reservation.start) as Timestamp, - parseDate(reservation.end) as Timestamp, - timeStartPos, - timeDurationHeight - ); -} +// function reservationStyles( +// reservation: Reservation, +// timeStartPos: (t: string) => string, +// timeDurationHeight: (d: number) => string +// ) { +// return genericBlockStyle( +// parseDate(reservation.start) as Timestamp, +// parseDate(reservation.end) as Timestamp, +// timeStartPos, +// timeDurationHeight +// ); +// } function blockStyles( block: Timeblock, @@ -190,33 +187,33 @@ function getBoatBlocks(scope: DayBodyScope): Timeblock[] { : []; } -function changeEvent({ start }: { start: string }) { - // const newBlocks = scheduleStore.getTimeblocksForDate(start); - // const reservations = scheduleStore.getBoatReservations( - // parsed(start) as Timestamp - // ); - // boatData.value.map((boat) => { - // boat.reservations = reservations.filter( - // (reservation) => reservation.resource === boat - // ); - // boat.blocks = newBlocks.filter( - // (block) => - // block.boatId === boat.$id && - // boat.reservations?.filter( - // (r: Reservation) => - // r.start < - // date.addToDate(makeDateTime(parsed(block.end) as Timestamp), { - // hours: 4, - // }) && - // r.end > - // date.addToDate(makeDateTime(parsed(block.start) as Timestamp), { - // hours: 4, - // }) - // ).length == 0 - // ); - // }); - // setTimeout(() => calendar.value?.scrollToTime('09:00'), 100); // Should figure out why we need this setTimeout... -} +// function changeEvent({ start }: { start: string }) { +// const newBlocks = scheduleStore.getTimeblocksForDate(start); +// const reservations = scheduleStore.getBoatReservations( +// parsed(start) as Timestamp +// ); +// boatData.value.map((boat) => { +// boat.reservations = reservations.filter( +// (reservation) => reservation.resource === boat +// ); +// boat.blocks = newBlocks.filter( +// (block) => +// block.boatId === boat.$id && +// boat.reservations?.filter( +// (r: Reservation) => +// r.start < +// date.addToDate(makeDateTime(parsed(block.end) as Timestamp), { +// hours: 4, +// }) && +// r.end > +// date.addToDate(makeDateTime(parsed(block.start) as Timestamp), { +// hours: 4, +// }) +// ).length == 0 +// ); +// }); +// setTimeout(() => calendar.value?.scrollToTime('09:00'), 100); // Should figure out why we need this setTimeout... +// } const disabledBefore = computed(() => { const todayTs = parseTimestamp(today()) as Timestamp; diff --git a/src/components/scheduling/boat/CalendarHeaderComponent.vue b/src/components/scheduling/boat/CalendarHeaderComponent.vue index 9f1daad..0fcf7aa 100644 --- a/src/components/scheduling/boat/CalendarHeaderComponent.vue +++ b/src/components/scheduling/boat/CalendarHeaderComponent.vue @@ -57,7 +57,7 @@ import { ref, reactive, computed } from 'vue'; const selectedDate = defineModel(); -const weekdays = reactive([0, 1, 2, 3, 4, 5, 6]), +const weekdays = reactive([1, 2, 3, 4, 5, 6, 0]), locale = ref('en-CA'), monthFormatter = monthFormatterFunc(), dayFormatter = dayFormatterFunc(), @@ -124,8 +124,14 @@ function dayClass(day: Timestamp) { } function monthFormatterFunc() { - const longOptions = { timeZone: 'UTC', month: 'long' }; - const shortOptions = { timeZone: 'UTC', month: 'short' }; + const longOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + month: 'long', + }; + const shortOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + month: 'short', + }; return createNativeLocaleFormatter(locale.value, (_tms, short) => short ? shortOptions : longOptions @@ -133,17 +139,28 @@ function monthFormatterFunc() { } function weekdayFormatterFunc() { - const longOptions = { timeZone: 'UTC', weekday: 'long' }; - const shortOptions = { timeZone: 'UTC', weekday: 'short' }; - + const longOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + weekday: 'long', + }; + const shortOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + weekday: 'short', + }; return createNativeLocaleFormatter(locale.value, (_tms, short) => short ? shortOptions : longOptions ); } function dayFormatterFunc() { - const longOptions = { timeZone: 'UTC', day: '2-digit' }; - const shortOptions = { timeZone: 'UTC', day: 'numeric' }; + const longOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + day: '2-digit', + }; + const shortOptions: Intl.DateTimeFormatOptions = { + timeZone: 'UTC', + day: 'numeric', + }; return createNativeLocaleFormatter(locale.value, (_tms, short) => short ? shortOptions : longOptions diff --git a/src/components/task/TaskCardComponent.vue b/src/components/task/TaskCardComponent.vue index db5c374..2acc942 100644 --- a/src/components/task/TaskCardComponent.vue +++ b/src/components/task/TaskCardComponent.vue @@ -20,5 +20,5 @@ import { defineProps } from 'vue'; import type { Task } from 'src/stores/task'; -const props = defineProps<{ task: Task }>(); +defineProps<{ task: Task }>(); diff --git a/src/components/task/TaskEditComponent.vue b/src/components/task/TaskEditComponent.vue index 3864cc6..9edd645 100644 --- a/src/components/task/TaskEditComponent.vue +++ b/src/components/task/TaskEditComponent.vue @@ -162,7 +162,7 @@ import { useRouter } from 'vue-router'; import { useTaskStore, TASKSTATUS } from 'src/stores/task'; import type { TaskTag, SkillTag, Task } from 'src/stores/task'; import { date } from 'quasar'; -import { Boat, useBoatStore } from 'src/stores/boat'; +import { useBoatStore } from 'src/stores/boat'; const props = defineProps<{ taskId?: string }>(); const taskStore = useTaskStore(); @@ -187,7 +187,7 @@ const targetTask = taskId && taskStore.tasks.find((t) => t.$id === taskId); const modifiedTask = reactive(targetTask ? targetTask : defaultTask); let tasks = taskStore.tasks; -const boatList = ref(useBoatStore().boats); +const boatList = useBoatStore().boats; const skillTagOptions = ref(taskStore.skillTags); const taskTagOptions = ref(taskStore.taskTags); diff --git a/src/pages/schedule/BoatReservationPage.vue b/src/pages/schedule/BoatReservationPage.vue index 5884495..992debf 100644 --- a/src/pages/schedule/BoatReservationPage.vue +++ b/src/pages/schedule/BoatReservationPage.vue @@ -30,7 +30,7 @@ rounded class="bg-warning text-grey-10" style="max-width: 95vw; margin: auto" - v-if="bookingForm.boat?.defects" + v-if="bookingForm.boat && bookingForm.boat.defects.length > 0" > @@ -63,7 +63,7 @@ >Passengers: {{ bookingForm.members.length + bookingForm.guests.length }} / - {{ bookingForm.boat.booking?.maxPassengers }} diff --git a/src/pages/schedule/ManageCalendar.vue b/src/pages/schedule/ManageCalendar.vue new file mode 100644 index 0000000..81c79b1 --- /dev/null +++ b/src/pages/schedule/ManageCalendar.vue @@ -0,0 +1,47 @@ + + + + + + + + HI! + + + + + + + diff --git a/src/pages/schedule/ScheduleIndexPage.vue b/src/pages/schedule/ScheduleIndexPage.vue index f49a585..608a171 100644 --- a/src/pages/schedule/ScheduleIndexPage.vue +++ b/src/pages/schedule/ScheduleIndexPage.vue @@ -23,5 +23,6 @@ const navlinks = [ label: 'Create a Reservation', }, { icon: 'calendar_month', to: '/schedule/view', label: 'View Schedule' }, + { icon: 'edit_calendar', to: '/schedule/manage', label: 'Manage Calendar' }, ]; diff --git a/src/router/routes.ts b/src/router/routes.ts index da82259..b6afe89 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -40,6 +40,11 @@ const routes: RouteRecordRaw[] = [ component: () => import('src/pages/schedule/BoatScheduleView.vue'), name: 'boat-schedule', }, + { + path: 'manage', + component: () => import('src/pages/schedule/ManageCalendar.vue'), + name: 'manage-schedule', + }, ], }, { diff --git a/src/stores/auth.ts b/src/stores/auth.ts index cc3ea68..f06466e 100644 --- a/src/stores/auth.ts +++ b/src/stores/auth.ts @@ -1,6 +1,6 @@ import { defineStore } from 'pinia'; import { ID, account } from 'boot/appwrite'; -import type { Models } from 'appwrite'; +import { OAuthProvider, type Models } from 'appwrite'; import { ref } from 'vue'; export const useAuthStore = defineStore('auth', () => { @@ -21,12 +21,12 @@ export const useAuthStore = defineStore('auth', () => { return await login(email, password); } async function login(email: string, password: string) { - await account.createEmailSession(email, password); + await account.createEmailPasswordSession(email, password); currentUser.value = await account.get(); } async function googleLogin() { account.createOAuth2Session( - 'google', + OAuthProvider.Google, 'https://bab.toal.ca/', 'https://bab.toal.ca/#/login' ); diff --git a/src/stores/boat.ts b/src/stores/boat.ts index d5a6db6..d74210d 100644 --- a/src/stores/boat.ts +++ b/src/stores/boat.ts @@ -13,10 +13,10 @@ export interface Boat extends Models.Document { year?: number; imgSrc?: string; iconSrc?: string; - bookingAvailable?: boolean; + bookingAvailable: boolean; requiredCerts: string[]; maxPassengers: number; - defects?: { + defects: { type: string; severity: string; description: string; diff --git a/src/stores/sampledata/schedule.ts b/src/stores/sampledata/schedule.ts index 93b20da..962b8e3 100644 --- a/src/stores/sampledata/schedule.ts +++ b/src/stores/sampledata/schedule.ts @@ -44,7 +44,7 @@ export function getSampleTimeBlocks(): Timeblock[] { for (let i = 0; i <= 30; i++) { const template = templateB; result.push( - ...boats + ...boats.value .map((b): Timeblock[] => { return template.blocks.map((t): Timeblock => { return { @@ -126,7 +126,7 @@ export function getSampleReservations(): Reservation[] { }; return sampleData.map((entry): Reservation => { - const boat = boatStore.boats.find((b) => b.$id == entry.boat); + const boat = boatStore.boats.value.find((b) => b.$id == entry.boat); return { id: entry.id, user: entry.user, diff --git a/src/stores/schedule.types.ts b/src/stores/schedule.types.ts index b1fab1a..dfba260 100644 --- a/src/stores/schedule.types.ts +++ b/src/stores/schedule.types.ts @@ -18,12 +18,12 @@ export interface Reservation { objects in here? */ export type timeTuple = [start: string, end: string]; -export interface Timeblock extends Models.Document { +export type Timeblock = Partial & { boatId: string; start: string; end: string; selected?: false; -} +}; export interface TimeBlockTemplate { id: string; diff --git a/tsconfig.vue-tsc.json b/tsconfig.vue-tsc.json new file mode 100644 index 0000000..90a2bcb --- /dev/null +++ b/tsconfig.vue-tsc.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "skipLibCheck": true + } +} diff --git a/yarn.lock b/yarn.lock index 3ef1716..ee61083 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,7 +19,7 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -1464,6 +1464,28 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz#966a6279060eb2d9d1a02ea1a331af071afdcf9e" integrity sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg== +"@volar/language-core@1.11.1", "@volar/language-core@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.11.1.tgz#ecdf12ea8dc35fb8549e517991abcbf449a5ad4f" + integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw== + dependencies: + "@volar/source-map" "1.11.1" + +"@volar/source-map@1.11.1", "@volar/source-map@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.11.1.tgz#535b0328d9e2b7a91dff846cab4058e191f4452f" + integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg== + dependencies: + muggle-string "^0.3.1" + +"@volar/typescript@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.11.1.tgz#ba86c6f326d88e249c7f5cfe4b765be3946fd627" + integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ== + dependencies: + "@volar/language-core" "1.11.1" + path-browserify "^1.0.1" + "@vue/compiler-core@3.4.25": version "3.4.25" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.25.tgz#691f59ee5014f6f2a2488fd4465f892e1e82f729" @@ -1475,6 +1497,17 @@ estree-walker "^2.0.2" source-map-js "^1.2.0" +"@vue/compiler-core@3.4.26": + version "3.4.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.26.tgz#d507886520e83a6f8339ed55ed0b2b5d84b44b73" + integrity sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/shared" "3.4.26" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + "@vue/compiler-dom@3.4.25": version "3.4.25" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz#b367e0c84e11d9e9f70beabdd6f6b2277fde375f" @@ -1483,6 +1516,14 @@ "@vue/compiler-core" "3.4.25" "@vue/shared" "3.4.25" +"@vue/compiler-dom@^3.3.0": + version "3.4.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz#acc7b788b48152d087d4bb9e655b795e3dbec554" + integrity sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA== + dependencies: + "@vue/compiler-core" "3.4.26" + "@vue/shared" "3.4.26" + "@vue/compiler-sfc@3.4.25": version "3.4.25" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz#ceab148f81571c8b251e8a8b75a9972addf1db8b" @@ -1511,6 +1552,21 @@ resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83" integrity sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA== +"@vue/language-core@1.8.27": + version "1.8.27" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.27.tgz#2ca6892cb524e024a44e554e4c55d7a23e72263f" + integrity sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA== + dependencies: + "@volar/language-core" "~1.11.1" + "@volar/source-map" "~1.11.1" + "@vue/compiler-dom" "^3.3.0" + "@vue/shared" "^3.3.0" + computeds "^0.0.1" + minimatch "^9.0.3" + muggle-string "^0.3.1" + path-browserify "^1.0.1" + vue-template-compiler "^2.7.14" + "@vue/reactivity@3.4.25": version "3.4.25" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.25.tgz#74983b146e06ce3341d15382669350125375d36f" @@ -1548,6 +1604,11 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.25.tgz#243ba8543e7401751e0ca319f75a80f153edd273" integrity sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA== +"@vue/shared@3.4.26", "@vue/shared@^3.3.0": + version "3.4.26" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.26.tgz#f17854fb1faf889854aed4b23b60e86a8cab6403" + integrity sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ== + accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1586,7 +1647,7 @@ ajv@^8.0.1, ajv@^8.6.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1936,7 +1997,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.1, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -2044,6 +2105,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -2079,6 +2145,11 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +computeds@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" + integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2194,6 +2265,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2904,7 +2980,7 @@ fast-glob@3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9: +fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -3240,6 +3316,11 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + html-minifier-terser@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" @@ -3846,7 +3927,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -3860,6 +3941,13 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -3880,6 +3968,11 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +muggle-string@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a" + integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -3935,6 +4028,13 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + nth-check@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -4071,6 +4171,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4081,7 +4186,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -4457,7 +4562,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.6.0: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.5.0, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -4796,6 +4901,11 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-invariant@^1.1.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -4923,10 +5033,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^4.5.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@~5.3.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== unbox-primitive@^1.0.2: version "1.0.2" @@ -5018,6 +5128,27 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vite-plugin-checker@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.6.4.tgz#aca186ab605aa15bd2c5dd9cc6d7c8fdcbe214ec" + integrity sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA== + dependencies: + "@babel/code-frame" "^7.12.13" + ansi-escapes "^4.3.0" + chalk "^4.1.1" + chokidar "^3.5.1" + commander "^8.0.0" + fast-glob "^3.2.7" + fs-extra "^11.1.0" + npm-run-path "^4.0.1" + semver "^7.5.0" + strip-ansi "^6.0.0" + tiny-invariant "^1.1.0" + vscode-languageclient "^7.0.0" + vscode-languageserver "^7.0.0" + vscode-languageserver-textdocument "^1.0.1" + vscode-uri "^3.0.2" + vite@^2.9.13: version "2.9.18" resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.18.tgz#74e2a83b29da81e602dac4c293312cc575f091c7" @@ -5030,6 +5161,50 @@ vite@^2.9.13: optionalDependencies: fsevents "~2.3.2" +vscode-jsonrpc@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" + integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== + +vscode-languageclient@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz#b505c22c21ffcf96e167799757fca07a6bad0fb2" + integrity sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg== + dependencies: + minimatch "^3.0.4" + semver "^7.3.4" + vscode-languageserver-protocol "3.16.0" + +vscode-languageserver-protocol@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" + integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== + dependencies: + vscode-jsonrpc "6.0.0" + vscode-languageserver-types "3.16.0" + +vscode-languageserver-textdocument@^1.0.1: + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== + +vscode-languageserver-types@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== + +vscode-languageserver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz#49b068c87cfcca93a356969d20f5d9bdd501c6b0" + integrity sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw== + dependencies: + vscode-languageserver-protocol "3.16.0" + +vscode-uri@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + vue-demi@>=0.14.5: version "0.14.7" resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2" @@ -5055,6 +5230,23 @@ vue-router@4: dependencies: "@vue/devtools-api" "^6.5.1" +vue-template-compiler@^2.7.14: + version "2.7.16" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b" + integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +vue-tsc@^1.8.22: + version "1.8.27" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.27.tgz#feb2bb1eef9be28017bb9e95e2bbd1ebdd48481c" + integrity sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg== + dependencies: + "@volar/typescript" "~1.11.1" + "@vue/language-core" "1.8.27" + semver "^7.5.4" + vue@3: version "3.4.25" resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.25.tgz#e59d4ed36389647b52ff2fd7aa84bb6691f4205b"
{{ title }}
Count: {{ todoCount }} / {{ meta.totalCount }}
Active: {{ active ? 'yes' : 'no' }}
Clicks on todos: {{ clickCount }}