From 90bc2e5c8990e0fd959066260bc507e594292165 Mon Sep 17 00:00:00 2001 From: productdevbook Date: Sat, 6 Aug 2022 19:03:17 +0300 Subject: [PATCH 1/4] feat: admin --- apps/vue-admin/.eslintignore | 2 + apps/vue-admin/.eslintrc | 8 + apps/vue-admin/.eslintrc-auto-import.json | 317 +++++++++ apps/vue-admin/.gitignore | 24 + apps/vue-admin/.vscode/extensions.json | 3 + apps/vue-admin/README.md | 16 + apps/vue-admin/index.html | 28 + .../locales/available-languages.json | 4 + apps/vue-admin/locales/en-US.json | 109 +++ apps/vue-admin/locales/set-language.ts | 21 + apps/vue-admin/locales/tr-TR.json | 85 +++ apps/vue-admin/package.json | 71 ++ apps/vue-admin/postcss.config.js | 6 + .../vue-admin/public/android-chrome-96x96.png | Bin 0 -> 2176 bytes apps/vue-admin/public/apple-touch-icon.png | Bin 0 -> 3826 bytes apps/vue-admin/public/favicon.ico | Bin 0 -> 7406 bytes apps/vue-admin/public/logo-dark.png | Bin 0 -> 2746 bytes apps/vue-admin/public/logo-light.png | Bin 0 -> 2778 bytes apps/vue-admin/public/pwa-192x192.png | Bin 0 -> 3914 bytes apps/vue-admin/public/pwa-512x512.png | Bin 0 -> 10261 bytes apps/vue-admin/public/robots.txt | 2 + apps/vue-admin/public/safari-pinned-tab.svg | 41 ++ apps/vue-admin/src/App.vue | 182 +++++ apps/vue-admin/src/assets/base.css | 3 + apps/vue-admin/src/assets/logo.png | Bin 0 -> 6849 bytes apps/vue-admin/src/auto-imports.d.ts | 636 +++++++++++++++++ apps/vue-admin/src/components.d.ts | 37 + apps/vue-admin/src/components/HelloWorld.vue | 54 ++ apps/vue-admin/src/components/MainPanel.vue | 5 + apps/vue-admin/src/components/SidePanel.vue | 118 ++++ .../src/components/org/left-sidebar.vue | 3 + .../vue-admin/src/components/tem/LoadData.vue | 10 + apps/vue-admin/src/composables/auth.ts | 76 ++ apps/vue-admin/src/composables/get-theme.ts | 17 + apps/vue-admin/src/layouts/default.vue | 129 ++++ apps/vue-admin/src/layouts/user.vue | 47 ++ apps/vue-admin/src/main.ts | 83 +++ apps/vue-admin/src/modules/apollo-graphql.ts | 187 +++++ apps/vue-admin/src/modules/i18n.ts | 16 + apps/vue-admin/src/pages/[username]/index.vue | 48 ++ apps/vue-admin/src/pages/auth/forgot.vue | 100 +++ apps/vue-admin/src/pages/auth/login.vue | 168 +++++ apps/vue-admin/src/pages/auth/signup.vue | 180 +++++ apps/vue-admin/src/pages/index.vue | 430 ++++++++++++ apps/vue-admin/src/pages/onlogin.vue | 18 + apps/vue-admin/src/router.ts | 47 ++ apps/vue-admin/src/services/notifications.ts | 55 ++ apps/vue-admin/src/shims-vue.d.ts | 23 + apps/vue-admin/src/stores/useAppStore.ts | 43 ++ apps/vue-admin/src/stores/useUserStore.ts | 34 + apps/vue-admin/src/utils/use-popper.ts | 34 + apps/vue-admin/tailwind.config.js | 33 + apps/vue-admin/tsconfig.json | 48 ++ apps/vue-admin/tsconfig.node.json | 9 + apps/vue-admin/vite.config.ts | 140 ++++ package.json | 4 +- pnpm-lock.yaml | 653 +++++++----------- pnpm-workspace.yaml | 4 +- 58 files changed, 4021 insertions(+), 390 deletions(-) create mode 100644 apps/vue-admin/.eslintignore create mode 100644 apps/vue-admin/.eslintrc create mode 100644 apps/vue-admin/.eslintrc-auto-import.json create mode 100644 apps/vue-admin/.gitignore create mode 100644 apps/vue-admin/.vscode/extensions.json create mode 100644 apps/vue-admin/README.md create mode 100644 apps/vue-admin/index.html create mode 100644 apps/vue-admin/locales/available-languages.json create mode 100644 apps/vue-admin/locales/en-US.json create mode 100644 apps/vue-admin/locales/set-language.ts create mode 100644 apps/vue-admin/locales/tr-TR.json create mode 100644 apps/vue-admin/package.json create mode 100644 apps/vue-admin/postcss.config.js create mode 100644 apps/vue-admin/public/android-chrome-96x96.png create mode 100644 apps/vue-admin/public/apple-touch-icon.png create mode 100644 apps/vue-admin/public/favicon.ico create mode 100644 apps/vue-admin/public/logo-dark.png create mode 100644 apps/vue-admin/public/logo-light.png create mode 100644 apps/vue-admin/public/pwa-192x192.png create mode 100644 apps/vue-admin/public/pwa-512x512.png create mode 100644 apps/vue-admin/public/robots.txt create mode 100644 apps/vue-admin/public/safari-pinned-tab.svg create mode 100644 apps/vue-admin/src/App.vue create mode 100644 apps/vue-admin/src/assets/base.css create mode 100644 apps/vue-admin/src/assets/logo.png create mode 100644 apps/vue-admin/src/auto-imports.d.ts create mode 100644 apps/vue-admin/src/components.d.ts create mode 100644 apps/vue-admin/src/components/HelloWorld.vue create mode 100644 apps/vue-admin/src/components/MainPanel.vue create mode 100644 apps/vue-admin/src/components/SidePanel.vue create mode 100644 apps/vue-admin/src/components/org/left-sidebar.vue create mode 100644 apps/vue-admin/src/components/tem/LoadData.vue create mode 100644 apps/vue-admin/src/composables/auth.ts create mode 100644 apps/vue-admin/src/composables/get-theme.ts create mode 100644 apps/vue-admin/src/layouts/default.vue create mode 100644 apps/vue-admin/src/layouts/user.vue create mode 100644 apps/vue-admin/src/main.ts create mode 100644 apps/vue-admin/src/modules/apollo-graphql.ts create mode 100644 apps/vue-admin/src/modules/i18n.ts create mode 100644 apps/vue-admin/src/pages/[username]/index.vue create mode 100644 apps/vue-admin/src/pages/auth/forgot.vue create mode 100644 apps/vue-admin/src/pages/auth/login.vue create mode 100644 apps/vue-admin/src/pages/auth/signup.vue create mode 100644 apps/vue-admin/src/pages/index.vue create mode 100644 apps/vue-admin/src/pages/onlogin.vue create mode 100644 apps/vue-admin/src/router.ts create mode 100644 apps/vue-admin/src/services/notifications.ts create mode 100644 apps/vue-admin/src/shims-vue.d.ts create mode 100644 apps/vue-admin/src/stores/useAppStore.ts create mode 100644 apps/vue-admin/src/stores/useUserStore.ts create mode 100644 apps/vue-admin/src/utils/use-popper.ts create mode 100644 apps/vue-admin/tailwind.config.js create mode 100644 apps/vue-admin/tsconfig.json create mode 100644 apps/vue-admin/tsconfig.node.json create mode 100644 apps/vue-admin/vite.config.ts diff --git a/apps/vue-admin/.eslintignore b/apps/vue-admin/.eslintignore new file mode 100644 index 00000000..fc4cb3ef --- /dev/null +++ b/apps/vue-admin/.eslintignore @@ -0,0 +1,2 @@ +auto-imports.d.ts +components.d.ts \ No newline at end of file diff --git a/apps/vue-admin/.eslintrc b/apps/vue-admin/.eslintrc new file mode 100644 index 00000000..51907888 --- /dev/null +++ b/apps/vue-admin/.eslintrc @@ -0,0 +1,8 @@ +{ + "extends": ["@antfu"], + "rules": { + "@typescript-eslint/consistent-type-imports": "off", + "vue/no-deprecated-slot-attribute": "off", + "vue/valid-template-root": "off" + } +} diff --git a/apps/vue-admin/.eslintrc-auto-import.json b/apps/vue-admin/.eslintrc-auto-import.json new file mode 100644 index 00000000..937e81d0 --- /dev/null +++ b/apps/vue-admin/.eslintrc-auto-import.json @@ -0,0 +1,317 @@ +{ + "globals": { + "CreateTokenNotificationDocument": true, + "EffectScope": true, + "FieldContextKey": true, + "ForgotPasswordDocument": true, + "FormContextKey": true, + "GetUserInfoDocument": true, + "LoginDocument": true, + "LogoutDocument": true, + "ResetPasswordDocument": true, + "SignupDocument": true, + "acceptHMRUpdate": true, + "asyncComputed": true, + "auth": true, + "autoResetRef": true, + "changeLocalStoreTheme": true, + "computed": true, + "computedAsync": true, + "computedEager": true, + "computedInject": true, + "computedWithControl": true, + "configure": true, + "controlledComputed": true, + "controlledRef": true, + "createApp": true, + "createEventHook": true, + "createGlobalState": true, + "createInjectionState": true, + "createPinia": true, + "createReactiveFn": true, + "createSharedComposable": true, + "createUnrefFn": true, + "customRef": true, + "debouncedRef": true, + "debouncedWatch": true, + "defineAsyncComponent": true, + "defineComponent": true, + "defineRule": true, + "defineStore": true, + "eagerComputed": true, + "effectScope": true, + "extendRef": true, + "getActivePinia": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "ignorableWatch": true, + "inject": true, + "isDefined": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "logicAnd": true, + "logicNot": true, + "logicOr": true, + "makeDestructurable": true, + "mapActions": true, + "mapGetters": true, + "mapState": true, + "mapStores": true, + "mapWritableState": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onClickOutside": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onKeyStroke": true, + "onLongPress": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onStartTyping": true, + "onUnmounted": true, + "onUpdated": true, + "pausableWatch": true, + "provide": true, + "reactify": true, + "reactifyObject": true, + "reactive": true, + "reactiveComputed": true, + "reactiveOmit": true, + "reactivePick": true, + "readonly": true, + "ref": true, + "refAutoReset": true, + "refDebounced": true, + "refDefault": true, + "refThrottled": true, + "refWithControl": true, + "resolveComponent": true, + "resolveRef": true, + "resolveUnref": true, + "setActivePinia": true, + "setMapStoreSuffix": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "storeToRefs": true, + "syncRef": true, + "syncRefs": true, + "templateRef": true, + "throttledRef": true, + "throttledWatch": true, + "toRaw": true, + "toReactive": true, + "toRef": true, + "toRefs": true, + "triggerRef": true, + "tryOnBeforeMount": true, + "tryOnBeforeUnmount": true, + "tryOnMounted": true, + "tryOnScopeDispose": true, + "tryOnUnmounted": true, + "unref": true, + "unrefElement": true, + "until": true, + "useActiveElement": true, + "useAppStore": true, + "useAsyncQueue": true, + "useAsyncState": true, + "useAttrs": true, + "useAuth": true, + "useBase64": true, + "useBattery": true, + "useBluetooth": true, + "useBreakpoints": true, + "useBroadcastChannel": true, + "useBrowserLocation": true, + "useCached": true, + "useClamp": true, + "useClipboard": true, + "useColorMode": true, + "useConfetti": true, + "useConfirmDialog": true, + "useCounter": true, + "useCreateTokenNotificationMutation": true, + "useCssModule": true, + "useCssVar": true, + "useCssVars": true, + "useCurrentElement": true, + "useCycleList": true, + "useDark": true, + "useDateFormat": true, + "useDebounce": true, + "useDebounceFn": true, + "useDebouncedRefHistory": true, + "useDeviceMotion": true, + "useDeviceOrientation": true, + "useDevicePixelRatio": true, + "useDevicesList": true, + "useDialogRoute": true, + "useDialogRouteLeave": true, + "useDisplayMedia": true, + "useDocumentVisibility": true, + "useDraggable": true, + "useDropZone": true, + "useElementBounding": true, + "useElementByPoint": true, + "useElementHover": true, + "useElementSize": true, + "useElementVisibility": true, + "useEventBus": true, + "useEventListener": true, + "useEventSource": true, + "useEyeDropper": true, + "useFavicon": true, + "useFetch": true, + "useField": true, + "useFieldArray": true, + "useFieldError": true, + "useFieldValue": true, + "useFileDialog": true, + "useFileSystemAccess": true, + "useFocus": true, + "useFocusWithin": true, + "useForgotPasswordMutation": true, + "useForm": true, + "useFormErrors": true, + "useFormSection": true, + "useFormValues": true, + "useFps": true, + "useFullscreen": true, + "useGamepad": true, + "useGeolocation": true, + "useGetUserInfoLazyQuery": true, + "useGetUserInfoQuery": true, + "useHead": true, + "useI18n": true, + "useIdle": true, + "useImage": true, + "useInfiniteScroll": true, + "useIntersectionObserver": true, + "useInterval": true, + "useIntervalFn": true, + "useIsFieldDirty": true, + "useIsFieldTouched": true, + "useIsFieldValid": true, + "useIsFormDirty": true, + "useIsFormTouched": true, + "useIsFormValid": true, + "useIsSubmitting": true, + "useKeyModifier": true, + "useLastChanged": true, + "useLocalStorage": true, + "useLoginMutation": true, + "useLogoutMutation": true, + "useMagicKeys": true, + "useManualRefHistory": true, + "useMediaControls": true, + "useMediaQuery": true, + "useMemoize": true, + "useMemory": true, + "useMounted": true, + "useMouse": true, + "useMouseInElement": true, + "useMousePressed": true, + "useMutationObserver": true, + "useNavigatorLanguage": true, + "useNetwork": true, + "useNow": true, + "useObjectUrl": true, + "useOffsetPagination": true, + "useOnline": true, + "usePWebNotification": true, + "usePageLeave": true, + "useParallax": true, + "usePermission": true, + "usePointer": true, + "usePointerSwipe": true, + "usePreferredColorScheme": true, + "usePreferredDark": true, + "usePreferredLanguages": true, + "useRafFn": true, + "useRefHistory": true, + "useRenderIcon": true, + "useResetForm": true, + "useResetPasswordMutation": true, + "useResizeObserver": true, + "useRoute": true, + "useRouter": true, + "useScreenOrientation": true, + "useScreenSafeArea": true, + "useScriptTag": true, + "useScroll": true, + "useScrollLock": true, + "useSessionStorage": true, + "useShare": true, + "useSignupMutation": true, + "useSlots": true, + "useSpeechRecognition": true, + "useSpeechSynthesis": true, + "useStepper": true, + "useStorage": true, + "useStorageAsync": true, + "useStyleTag": true, + "useSubmitCount": true, + "useSubmitForm": true, + "useSwipe": true, + "useTemplateRefsList": true, + "useTextSelection": true, + "useTextareaAutosize": true, + "useThrottle": true, + "useThrottleFn": true, + "useThrottledRefHistory": true, + "useTimeAgo": true, + "useTimeout": true, + "useTimeoutFn": true, + "useTimeoutPoll": true, + "useTimestamp": true, + "useTitle": true, + "useToast": true, + "useToastWeb": true, + "useToggle": true, + "useTransition": true, + "useUrlSearchParams": true, + "useUserMedia": true, + "useUserStore": true, + "useVModel": true, + "useVModels": true, + "useValidateField": true, + "useValidateForm": true, + "useVibrate": true, + "useVirtualList": true, + "useWakeLock": true, + "useWebNotification": true, + "useWebSocket": true, + "useWebWorker": true, + "useWebWorkerFn": true, + "useWindowFocus": true, + "useWindowScroll": true, + "useWindowSize": true, + "validate": true, + "viewport": true, + "watch": true, + "watchArray": true, + "watchAtMost": true, + "watchDebounced": true, + "watchEffect": true, + "watchIgnorable": true, + "watchOnce": true, + "watchPausable": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "watchThrottled": true, + "watchTriggerable": true, + "watchWithFilter": true, + "whenever": true + } +} \ No newline at end of file diff --git a/apps/vue-admin/.gitignore b/apps/vue-admin/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/apps/vue-admin/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/vue-admin/.vscode/extensions.json b/apps/vue-admin/.vscode/extensions.json new file mode 100644 index 00000000..3dc5b08b --- /dev/null +++ b/apps/vue-admin/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["johnsoncodehk.volar"] +} diff --git a/apps/vue-admin/README.md b/apps/vue-admin/README.md new file mode 100644 index 00000000..b53dcfb1 --- /dev/null +++ b/apps/vue-admin/README.md @@ -0,0 +1,16 @@ +# Vue 3 + Typescript + Vite + +This template should help get you started developing with Vue 3 and Typescript in Vite. The template uses Vue 3 ` + + +
+
+
+ + + diff --git a/apps/vue-admin/locales/available-languages.json b/apps/vue-admin/locales/available-languages.json new file mode 100644 index 00000000..cf1c2c7a --- /dev/null +++ b/apps/vue-admin/locales/available-languages.json @@ -0,0 +1,4 @@ +{ + "en-US": "English (United States)", + "tr-TR": "Turkish (Turkey)" +} diff --git a/apps/vue-admin/locales/en-US.json b/apps/vue-admin/locales/en-US.json new file mode 100644 index 00000000..fdd17e05 --- /dev/null +++ b/apps/vue-admin/locales/en-US.json @@ -0,0 +1,109 @@ +{ + "account": { + "backButton": "Back", + "changePassword": "Change password", + "merhaba": "Merhaba", + "discord": "Discord", + "heading": "Account", + "keys": "API keys", + "legal": "Terms of services", + "logout": "Logout", + "personalInformation": "Personal information", + "preferences": "Notifications", + "privacy": "Privacy policy", + "support": "Support", + "usage": "usage" + }, + "accountPassword": { + "confirmPassword": "Confirm password", + "errorMsg": "Error happened, please try again", + "heading": "Change my password", + "password": "New password", + "success": "Changed password successfully", + "validate": "Validate", + "password_matches": "Passwords must match" + }, + "accountProfile": { + "country": "Country", + "email": "Email", + "first-name": "First name", + "heading": "Personal information", + "last-name": "Last name", + "update": "Update" + }, + "forgot": { + "check_email": "Check your email to get the link to reset your password", + "email": "Email", + "heading": "Forgot password", + "sub_heading": "Enter your email address and we'll send you a link to reset your password.", + "success": "Password updated success" + }, + "login": { + "andpass": "And password", + "connexion": "Login", + "create-new": "Create new account", + "email": "Email", + "forgot": "forgot", + "hello": "Hello", + "login-in": "Sign in", + "or": "or", + "password": "Password", + "withemail": "With email adress", + "signup": "Sign up", + "remember": "Remember me" + }, + "signup": { + "email": "Email", + "heading": "Sign up", + "subHeading": "Create your account", + "password": "Password", + "error_confirm_password": "Passwords must match", + "confirm_password": "Confirm password", + "name": "Name", + "display-name": "Display name", + "username": "Username", + "password_confirmation": "Confirm password", + "submit": "Sign up", + "terms": "I agree to the terms of services", + "have_account_login": "Already have an account? Login", + "error_terms": "You must agree to the terms of services", + "success": "Success" + }, + "password": { + "heading": "Create Password", + "new": "New Password", + "validate": "Validate" + }, + "resetPassword": { + "heading": "Reset Password", + "input": "Enter your code", + "button": "Send password reset email", + "new_password": "New Password", + "confirm_password": "Confirm Password", + "change_password": "Change Password", + "password_match_regexp": "Password must be at least 8 characters long and contain at least one number, one uppercase and one lowercase letter" + }, + "activation": { + "desc": "Fill the following fields to complete your registration", + "doi": "Optional consent", + "doi-desc": "I accept Email newsletter and future marketing offers", + "heading": "activation", + "headline": "My settings", + "legal": "Terms of services", + "legal-desc": "I accept Capgo app privacy policy and terms of use", + "notification": "Notifications", + "notification-desc": "I accept to receive notification when new app version are available", + "validate": "Validate" + }, + "language": { + "change": "Change language" + }, + "global": { + "error": "Error", + "save": "Save", + "success": "Success", + "warning": "Warning", + "cancel": "Cancel", + "version": "Version" + } +} diff --git a/apps/vue-admin/locales/set-language.ts b/apps/vue-admin/locales/set-language.ts new file mode 100644 index 00000000..0780d573 --- /dev/null +++ b/apps/vue-admin/locales/set-language.ts @@ -0,0 +1,21 @@ +import type { Composer } from 'vue-i18n' + +export async function setLanguage(lang: any, i18n: any): Promise { + if (i18n.mode === 'legacy') + i18n.global.locale.value = lang + + else + (i18n.global as unknown as Composer).locale.value = lang + + /** + * NOTE: + * If you need to specify the language setting for headers, such as the `fetch` API, set it here. + * The following is an example for axios. + * + * axios.defaults.headers.common['Accept-Language'] = locale + */ + + const html = document.querySelector('html') + html?.setAttribute('lang', lang) + return true +} diff --git a/apps/vue-admin/locales/tr-TR.json b/apps/vue-admin/locales/tr-TR.json new file mode 100644 index 00000000..ef9e0511 --- /dev/null +++ b/apps/vue-admin/locales/tr-TR.json @@ -0,0 +1,85 @@ +{ + "account": { + "backButton": "Back", + "changePassword": "Change password", + "discord": "Discord", + "heading": "Account", + "keys": "API keys", + "legal": "Terms of services", + "logout": "Logout", + "personalInformation": "Personal information", + "preferences": "Notifications", + "privacy": "Privacy policy", + "support": "Support", + "usage": "usage" + }, + "accountPassword": { + "confirmPassword": "Confirm password", + "errorMsg": "Error happened, please try again", + "heading": "Change my password", + "password": "New password", + "success": "Changed password successfully", + "validate": "Validate", + "password_matches": "Passwords must match" + }, + "accountProfile": { + "country": "Country", + "email": "Email", + "first-name": "First name", + "heading": "Personal information", + "last-name": "Last name", + "update": "Update" + }, + "forgot": { + "check_email": "Check your email to get the link to reset your password", + "email": "Email", + "heading": "Forgot password", + "success": "Password updated successfully" + }, + "login": { + "andpass": "And password", + "connexion": "Login", + "create-new": "Create new account", + "email": "Email", + "forgot": "forgot", + "hello": "Hello", + "login-in": "Login in", + "or": "or", + "password": "Sifre", + "withemail": "With email adress" + }, + "password": { + "heading": "Create Password", + "new": "New Password", + "validate": "Validate" + }, + "register": { + "already-account": "You already have an account?", + "check-email": "Please check your email and verify", + "confirm-email": "Confirm email", + "confirm-password": "Confirm password", + "desc": "Fill the following fields to complete your registration", + "email": "Email", + "first-name": "first name", + "heading": "Registration", + "last-name": "last name", + "lowerCaseError": "Should contain lowercase letters", + "next": "Next", + "password": "password", + "password-hint": "Enter a combination of at least 6 numbers, letters and punctuations.", + "specialError": "Should contain special characters", + "upperCaseError": "Should contain uppercase letters" + }, + "activation": { + "desc": "Fill the following fields to complete your registration", + "doi": "Optional consent", + "doi-desc": "I accept Email newsletter and future marketing offers", + "heading": "activation", + "headline": "My settings", + "legal": "Terms of services", + "legal-desc": "I accept Capgo app privacy policy and terms of use", + "notification": "Notifications", + "notification-desc": "I accept to receive notification when new app version are available", + "validate": "Validate" + } +} diff --git a/apps/vue-admin/package.json b/apps/vue-admin/package.json new file mode 100644 index 00000000..7053bee2 --- /dev/null +++ b/apps/vue-admin/package.json @@ -0,0 +1,71 @@ +{ + "name": "vue-admin", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite --port 3100", + "android:dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist", + "lint": "eslint \"./**/*.{ts,vue}\"", + "lint:fix": "eslint --fix \"./**/*.{ts,vue}\"" + }, + "dependencies": { + "@apollo/client": "3.6.9", + "@headlessui/vue": "1.6.7", + "@intlify/vite-plugin-vue-i18n": "5.0.1", + "@oku/api": "workspace:*", + "@popperjs/core": "2.11.5", + "@productdevbook/auth": "0.2.1", + "@vee-validate/i18n": "4.6.2", + "@vue/apollo-composable": "4.0.0-alpha.19", + "@vueuse/core": "8.9.4", + "@vueuse/head": "0.7.7", + "@vueuse/integrations": "8.9.4", + "apollo-upload-client": "17.0.0", + "crypto-js": "4.1.1", + "firebase": "9.9.1", + "got": "12.2.0", + "graphql": "16.5.0", + "graphql-ws": "5.9.1", + "gsap": "3.10.4", + "nprogress": "0.2.0", + "oku-i18n": "workspace*", + "pinia": "2.0.16", + "universal-cookie": "4.0.4", + "unocss": "0.44.7", + "unplugin-auto-import": "0.10.1", + "unplugin-vue-components": "0.21.1", + "vite-plugin-pages": "0.25.0", + "vite-plugin-vue-layouts": "0.7.0", + "vue": "3.2.37", + "vue-app": "workspace:*", + "vue-design-system": "workspace:*", + "vue-i18n": "9.2.0-beta.40", + "vue-router": "4.1.2", + "yup": "0.32.11" + }, + "devDependencies": { + "@antfu/eslint-config": "0.25.2", + "@oku/config": "workspace:*", + "@oku/tsconfig": "workspace:*", + "@tailwindcss/forms": "0.5.2", + "@tailwindcss/typography": "0.5.4", + "@types/apollo-upload-client": "17.0.1", + "@types/crypto-js": "4.1.1", + "@types/js-cookie": "3.0.2", + "@types/nprogress": "0.2.0", + "@vitejs/plugin-vue": "3.0.1", + "autoprefixer": "10.4.7", + "eslint": "8.20.0", + "naive-ui": "2.31.0", + "postcss": "8.4.14", + "tailwindcss": "3.1.6", + "typescript": "4.7.4", + "vite": "3.0.3", + "vite-plugin-glob": "0.3.2", + "vite-plugin-pwa": "0.12.3", + "vue-tsc": "0.39.0" + } +} diff --git a/apps/vue-admin/postcss.config.js b/apps/vue-admin/postcss.config.js new file mode 100644 index 00000000..12a703d9 --- /dev/null +++ b/apps/vue-admin/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/vue-admin/public/android-chrome-96x96.png b/apps/vue-admin/public/android-chrome-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..391190e8279dfd4996015ba88770dc00dd3ec642 GIT binary patch literal 2176 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 E55=8JVE_OC literal 0 HcmV?d00001 diff --git a/apps/vue-admin/public/logo-dark.png b/apps/vue-admin/public/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8e27f8a0ffa8e0509204f1d5805dc205bffef4ed GIT binary patch literal 2746 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 M#+F7^h8}VM2gRS|q5uE@ literal 0 HcmV?d00001 diff --git a/apps/vue-admin/public/logo-light.png b/apps/vue-admin/public/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6eaca6bb845ab49bd6f29c77298aa9494dca7d98 GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/apps/vue-admin/public/pwa-192x192.png b/apps/vue-admin/public/pwa-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a8aae8daf9d693e6660a05afb8a4a78bf37120f2 GIT binary patch literal 3914 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 + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/apps/vue-admin/src/App.vue b/apps/vue-admin/src/App.vue new file mode 100644 index 00000000..78d1d932 --- /dev/null +++ b/apps/vue-admin/src/App.vue @@ -0,0 +1,182 @@ + + + diff --git a/apps/vue-admin/src/assets/base.css b/apps/vue-admin/src/assets/base.css new file mode 100644 index 00000000..de15c91d --- /dev/null +++ b/apps/vue-admin/src/assets/base.css @@ -0,0 +1,3 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; \ No newline at end of file diff --git a/apps/vue-admin/src/assets/logo.png b/apps/vue-admin/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 + readonly EffectScope: UnwrapRef + readonly FieldContextKey: UnwrapRef + readonly ForgotPasswordDocument: UnwrapRef + readonly FormContextKey: UnwrapRef + readonly GetUserInfoDocument: UnwrapRef + readonly LoginDocument: UnwrapRef + readonly LogoutDocument: UnwrapRef + readonly ResetPasswordDocument: UnwrapRef + readonly SignupDocument: UnwrapRef + readonly acceptHMRUpdate: UnwrapRef + readonly asyncComputed: UnwrapRef + readonly auth: UnwrapRef + readonly autoResetRef: UnwrapRef + readonly changeLocalStoreTheme: UnwrapRef + readonly computed: UnwrapRef + readonly computedAsync: UnwrapRef + readonly computedEager: UnwrapRef + readonly computedInject: UnwrapRef + readonly computedWithControl: UnwrapRef + readonly configure: UnwrapRef + readonly controlledComputed: UnwrapRef + readonly controlledRef: UnwrapRef + readonly createApp: UnwrapRef + readonly createEventHook: UnwrapRef + readonly createGlobalState: UnwrapRef + readonly createInjectionState: UnwrapRef + readonly createPinia: UnwrapRef + readonly createReactiveFn: UnwrapRef + readonly createSharedComposable: UnwrapRef + readonly createUnrefFn: UnwrapRef + readonly customRef: UnwrapRef + readonly debouncedRef: UnwrapRef + readonly debouncedWatch: UnwrapRef + readonly defineAsyncComponent: UnwrapRef + readonly defineComponent: UnwrapRef + readonly defineRule: UnwrapRef + readonly defineStore: UnwrapRef + readonly eagerComputed: UnwrapRef + readonly effectScope: UnwrapRef + readonly extendRef: UnwrapRef + readonly getActivePinia: UnwrapRef + readonly getCurrentInstance: UnwrapRef + readonly getCurrentScope: UnwrapRef + readonly h: UnwrapRef + readonly ignorableWatch: UnwrapRef + readonly inject: UnwrapRef + readonly isDefined: UnwrapRef + readonly isProxy: UnwrapRef + readonly isReactive: UnwrapRef + readonly isReadonly: UnwrapRef + readonly isRef: UnwrapRef + readonly logicAnd: UnwrapRef + readonly logicNot: UnwrapRef + readonly logicOr: UnwrapRef + readonly makeDestructurable: UnwrapRef + readonly mapActions: UnwrapRef + readonly mapGetters: UnwrapRef + readonly mapState: UnwrapRef + readonly mapStores: UnwrapRef + readonly mapWritableState: UnwrapRef + readonly markRaw: UnwrapRef + readonly nextTick: UnwrapRef + readonly onActivated: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onBeforeUpdate: UnwrapRef + readonly onClickOutside: UnwrapRef + readonly onDeactivated: UnwrapRef + readonly onErrorCaptured: UnwrapRef + readonly onKeyStroke: UnwrapRef + readonly onLongPress: UnwrapRef + readonly onMounted: UnwrapRef + readonly onRenderTracked: UnwrapRef + readonly onRenderTriggered: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly onStartTyping: UnwrapRef + readonly onUnmounted: UnwrapRef + readonly onUpdated: UnwrapRef + readonly pausableWatch: UnwrapRef + readonly provide: UnwrapRef + readonly reactify: UnwrapRef + readonly reactifyObject: UnwrapRef + readonly reactive: UnwrapRef + readonly reactiveComputed: UnwrapRef + readonly reactiveOmit: UnwrapRef + readonly reactivePick: UnwrapRef + readonly readonly: UnwrapRef + readonly ref: UnwrapRef + readonly refAutoReset: UnwrapRef + readonly refDebounced: UnwrapRef + readonly refDefault: UnwrapRef + readonly refThrottled: UnwrapRef + readonly refWithControl: UnwrapRef + readonly resolveComponent: UnwrapRef + readonly resolveRef: UnwrapRef + readonly resolveUnref: UnwrapRef + readonly setActivePinia: UnwrapRef + readonly setMapStoreSuffix: UnwrapRef + readonly shallowReactive: UnwrapRef + readonly shallowReadonly: UnwrapRef + readonly shallowRef: UnwrapRef + readonly storeToRefs: UnwrapRef + readonly syncRef: UnwrapRef + readonly syncRefs: UnwrapRef + readonly templateRef: UnwrapRef + readonly throttledRef: UnwrapRef + readonly throttledWatch: UnwrapRef + readonly toRaw: UnwrapRef + readonly toReactive: UnwrapRef + readonly toRef: UnwrapRef + readonly toRefs: UnwrapRef + readonly triggerRef: UnwrapRef + readonly tryOnBeforeMount: UnwrapRef + readonly tryOnBeforeUnmount: UnwrapRef + readonly tryOnMounted: UnwrapRef + readonly tryOnScopeDispose: UnwrapRef + readonly tryOnUnmounted: UnwrapRef + readonly unref: UnwrapRef + readonly unrefElement: UnwrapRef + readonly until: UnwrapRef + readonly useActiveElement: UnwrapRef + readonly useAppStore: UnwrapRef + readonly useAsyncQueue: UnwrapRef + readonly useAsyncState: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useAuth: UnwrapRef + readonly useBase64: UnwrapRef + readonly useBattery: UnwrapRef + readonly useBluetooth: UnwrapRef + readonly useBreakpoints: UnwrapRef + readonly useBroadcastChannel: UnwrapRef + readonly useBrowserLocation: UnwrapRef + readonly useCached: UnwrapRef + readonly useClamp: UnwrapRef + readonly useClipboard: UnwrapRef + readonly useColorMode: UnwrapRef + readonly useConfetti: UnwrapRef + readonly useConfirmDialog: UnwrapRef + readonly useCounter: UnwrapRef + readonly useCreateTokenNotificationMutation: UnwrapRef + readonly useCssModule: UnwrapRef + readonly useCssVar: UnwrapRef + readonly useCssVars: UnwrapRef + readonly useCurrentElement: UnwrapRef + readonly useCycleList: UnwrapRef + readonly useDark: UnwrapRef + readonly useDateFormat: UnwrapRef + readonly useDebounce: UnwrapRef + readonly useDebounceFn: UnwrapRef + readonly useDebouncedRefHistory: UnwrapRef + readonly useDeviceMotion: UnwrapRef + readonly useDeviceOrientation: UnwrapRef + readonly useDevicePixelRatio: UnwrapRef + readonly useDevicesList: UnwrapRef + readonly useDialogRoute: UnwrapRef + readonly useDialogRouteLeave: UnwrapRef + readonly useDisplayMedia: UnwrapRef + readonly useDocumentVisibility: UnwrapRef + readonly useDraggable: UnwrapRef + readonly useDropZone: UnwrapRef + readonly useElementBounding: UnwrapRef + readonly useElementByPoint: UnwrapRef + readonly useElementHover: UnwrapRef + readonly useElementSize: UnwrapRef + readonly useElementVisibility: UnwrapRef + readonly useEventBus: UnwrapRef + readonly useEventListener: UnwrapRef + readonly useEventSource: UnwrapRef + readonly useEyeDropper: UnwrapRef + readonly useFavicon: UnwrapRef + readonly useFetch: UnwrapRef + readonly useField: UnwrapRef + readonly useFieldArray: UnwrapRef + readonly useFieldError: UnwrapRef + readonly useFieldValue: UnwrapRef + readonly useFileDialog: UnwrapRef + readonly useFileSystemAccess: UnwrapRef + readonly useFocus: UnwrapRef + readonly useFocusWithin: UnwrapRef + readonly useForgotPasswordMutation: UnwrapRef + readonly useForm: UnwrapRef + readonly useFormErrors: UnwrapRef + readonly useFormSection: UnwrapRef + readonly useFormValues: UnwrapRef + readonly useFps: UnwrapRef + readonly useFullscreen: UnwrapRef + readonly useGamepad: UnwrapRef + readonly useGeolocation: UnwrapRef + readonly useGetUserInfoLazyQuery: UnwrapRef + readonly useGetUserInfoQuery: UnwrapRef + readonly useHead: UnwrapRef + readonly useI18n: UnwrapRef + readonly useIdle: UnwrapRef + readonly useImage: UnwrapRef + readonly useInfiniteScroll: UnwrapRef + readonly useIntersectionObserver: UnwrapRef + readonly useInterval: UnwrapRef + readonly useIntervalFn: UnwrapRef + readonly useIsFieldDirty: UnwrapRef + readonly useIsFieldTouched: UnwrapRef + readonly useIsFieldValid: UnwrapRef + readonly useIsFormDirty: UnwrapRef + readonly useIsFormTouched: UnwrapRef + readonly useIsFormValid: UnwrapRef + readonly useIsSubmitting: UnwrapRef + readonly useKeyModifier: UnwrapRef + readonly useLastChanged: UnwrapRef + readonly useLocalStorage: UnwrapRef + readonly useLoginMutation: UnwrapRef + readonly useLogoutMutation: UnwrapRef + readonly useMagicKeys: UnwrapRef + readonly useManualRefHistory: UnwrapRef + readonly useMediaControls: UnwrapRef + readonly useMediaQuery: UnwrapRef + readonly useMemoize: UnwrapRef + readonly useMemory: UnwrapRef + readonly useMounted: UnwrapRef + readonly useMouse: UnwrapRef + readonly useMouseInElement: UnwrapRef + readonly useMousePressed: UnwrapRef + readonly useMutationObserver: UnwrapRef + readonly useNavigatorLanguage: UnwrapRef + readonly useNetwork: UnwrapRef + readonly useNow: UnwrapRef + readonly useObjectUrl: UnwrapRef + readonly useOffsetPagination: UnwrapRef + readonly useOnline: UnwrapRef + readonly usePWebNotification: UnwrapRef + readonly usePageLeave: UnwrapRef + readonly useParallax: UnwrapRef + readonly usePermission: UnwrapRef + readonly usePointer: UnwrapRef + readonly usePointerSwipe: UnwrapRef + readonly usePreferredColorScheme: UnwrapRef + readonly usePreferredDark: UnwrapRef + readonly usePreferredLanguages: UnwrapRef + readonly useRafFn: UnwrapRef + readonly useRefHistory: UnwrapRef + readonly useRenderIcon: UnwrapRef + readonly useResetForm: UnwrapRef + readonly useResetPasswordMutation: UnwrapRef + readonly useResizeObserver: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useScreenOrientation: UnwrapRef + readonly useScreenSafeArea: UnwrapRef + readonly useScriptTag: UnwrapRef + readonly useScroll: UnwrapRef + readonly useScrollLock: UnwrapRef + readonly useSessionStorage: UnwrapRef + readonly useShare: UnwrapRef + readonly useSignupMutation: UnwrapRef + readonly useSlots: UnwrapRef + readonly useSpeechRecognition: UnwrapRef + readonly useSpeechSynthesis: UnwrapRef + readonly useStepper: UnwrapRef + readonly useStorage: UnwrapRef + readonly useStorageAsync: UnwrapRef + readonly useStyleTag: UnwrapRef + readonly useSubmitCount: UnwrapRef + readonly useSubmitForm: UnwrapRef + readonly useSwipe: UnwrapRef + readonly useTemplateRefsList: UnwrapRef + readonly useTextSelection: UnwrapRef + readonly useTextareaAutosize: UnwrapRef + readonly useThrottle: UnwrapRef + readonly useThrottleFn: UnwrapRef + readonly useThrottledRefHistory: UnwrapRef + readonly useTimeAgo: UnwrapRef + readonly useTimeout: UnwrapRef + readonly useTimeoutFn: UnwrapRef + readonly useTimeoutPoll: UnwrapRef + readonly useTimestamp: UnwrapRef + readonly useTitle: UnwrapRef + readonly useToast: UnwrapRef + readonly useToastWeb: UnwrapRef + readonly useToggle: UnwrapRef + readonly useTransition: UnwrapRef + readonly useUrlSearchParams: UnwrapRef + readonly useUserMedia: UnwrapRef + readonly useUserStore: UnwrapRef + readonly useVModel: UnwrapRef + readonly useVModels: UnwrapRef + readonly useValidateField: UnwrapRef + readonly useValidateForm: UnwrapRef + readonly useVibrate: UnwrapRef + readonly useVirtualList: UnwrapRef + readonly useWakeLock: UnwrapRef + readonly useWebNotification: UnwrapRef + readonly useWebSocket: UnwrapRef + readonly useWebWorker: UnwrapRef + readonly useWebWorkerFn: UnwrapRef + readonly useWindowFocus: UnwrapRef + readonly useWindowScroll: UnwrapRef + readonly useWindowSize: UnwrapRef + readonly validate: UnwrapRef + readonly viewport: UnwrapRef + readonly watch: UnwrapRef + readonly watchArray: UnwrapRef + readonly watchAtMost: UnwrapRef + readonly watchDebounced: UnwrapRef + readonly watchEffect: UnwrapRef + readonly watchIgnorable: UnwrapRef + readonly watchOnce: UnwrapRef + readonly watchPausable: UnwrapRef + readonly watchPostEffect: UnwrapRef + readonly watchSyncEffect: UnwrapRef + readonly watchThrottled: UnwrapRef + readonly watchTriggerable: UnwrapRef + readonly watchWithFilter: UnwrapRef + readonly whenever: UnwrapRef + } +} diff --git a/apps/vue-admin/src/components.d.ts b/apps/vue-admin/src/components.d.ts new file mode 100644 index 00000000..abe62973 --- /dev/null +++ b/apps/vue-admin/src/components.d.ts @@ -0,0 +1,37 @@ +// generated by unplugin-vue-components +// We suggest you to commit this file into source control +// Read more: https://github.com/vuejs/core/pull/3399 +import '@vue/runtime-core' + +export {} + +declare module '@vue/runtime-core' { + export interface GlobalComponents { + AtomActionMessage: typeof import('./../../../packages/vue-design-system/components/atom/action-message.vue')['default'] + AtomButton: typeof import('./../../../packages/vue-design-system/components/atom/Button.vue')['default'] + AtomHDialogBg: typeof import('./../../../packages/vue-design-system/components/atom/h-dialog-bg.vue')['default'] + AtomHOverlay: typeof import('./../../../packages/vue-design-system/components/atom/h-overlay.vue')['default'] + AtomSectionTitle: typeof import('./../../../packages/vue-design-system/components/atom/section-title.vue')['default'] + ExploreContainer: typeof import('./../../../packages/vue-design-system/components/ExploreContainer.vue')['default'] + FormCheckboxWithValidation: typeof import('./../../../packages/vue-design-system/components/form/checkbox-with-validation.vue')['default'] + FormInputWithValidation: typeof import('./../../../packages/vue-design-system/components/form/input-with-validation.vue')['default'] + FormSection: typeof import('./../../../packages/vue-design-system/components/form/section.vue')['default'] + HelloWorld: typeof import('./components/HelloWorld.vue')['default'] + MainPanel: typeof import('./components/MainPanel.vue')['default'] + NButton: typeof import('naive-ui')['NButton'] + NConfigProvider: typeof import('naive-ui')['NConfigProvider'] + NDropdown: typeof import('naive-ui')['NDropdown'] + NGlobalStyle: typeof import('naive-ui')['NGlobalStyle'] + NInput: typeof import('naive-ui')['NInput'] + NMessageProvider: typeof import('naive-ui')['NMessageProvider'] + NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] + NScrollbar: typeof import('naive-ui')['NScrollbar'] + OrgLeftSidebar: typeof import('./components/org/left-sidebar.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SidePanel: typeof import('./components/SidePanel.vue')['default'] + TemLoadData: typeof import('./components/tem/LoadData.vue')['default'] + TitleHead: typeof import('./../../../packages/vue-design-system/components/TitleHead.vue')['default'] + UnoIcon: typeof import('./../../../packages/vue-design-system/components/UnoIcon.vue')['default'] + } +} diff --git a/apps/vue-admin/src/components/HelloWorld.vue b/apps/vue-admin/src/components/HelloWorld.vue new file mode 100644 index 00000000..f73ec64a --- /dev/null +++ b/apps/vue-admin/src/components/HelloWorld.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/apps/vue-admin/src/components/MainPanel.vue b/apps/vue-admin/src/components/MainPanel.vue new file mode 100644 index 00000000..f9be1301 --- /dev/null +++ b/apps/vue-admin/src/components/MainPanel.vue @@ -0,0 +1,5 @@ + diff --git a/apps/vue-admin/src/components/SidePanel.vue b/apps/vue-admin/src/components/SidePanel.vue new file mode 100644 index 00000000..72dbc108 --- /dev/null +++ b/apps/vue-admin/src/components/SidePanel.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/vue-admin/src/components/org/left-sidebar.vue b/apps/vue-admin/src/components/org/left-sidebar.vue new file mode 100644 index 00000000..198d28bc --- /dev/null +++ b/apps/vue-admin/src/components/org/left-sidebar.vue @@ -0,0 +1,3 @@ + diff --git a/apps/vue-admin/src/components/tem/LoadData.vue b/apps/vue-admin/src/components/tem/LoadData.vue new file mode 100644 index 00000000..6d2de438 --- /dev/null +++ b/apps/vue-admin/src/components/tem/LoadData.vue @@ -0,0 +1,10 @@ + + + diff --git a/apps/vue-admin/src/composables/auth.ts b/apps/vue-admin/src/composables/auth.ts new file mode 100644 index 00000000..ac901c86 --- /dev/null +++ b/apps/vue-admin/src/composables/auth.ts @@ -0,0 +1,76 @@ +import { AuthClient, AuthOptions } from '@productdevbook/auth' +import axios from 'axios' +export function useAuth() { + const customOptions = { + errorProperty: 'errors', + baseURL: 'http://localhost:4000', + endpoints: { + login: { + url: '/graphql', + method: 'post', + }, + logout: { + url: '/graphql', + method: 'post', + }, + user: { + url: '/graphql', + method: 'post', + }, + refresh: { + url: '/graphql', + method: 'post', + }, + signup: { + url: '/graphql', + method: 'post', + }, + }, + token: { + property: 'data.signIn.accessToken', + refreshProperty: 'data.signIn.refreshToken', + autoDecode: true, + name: 'Authorization', + storageName: 'access-token', + type: 'Bearer', + }, + user: { + autoFetch: false, + }, + refreshToken: { + property: 'data.refreshToken.refreshToken', + accessTokenProperty: 'data.refreshToken.accessToken', + refreshTokenProperty: 'data.refreshToken.refreshToken', + name: 'data', + autoLogout: true, + storageName: 'refresh-token', + enabled: true, + maxAge: 7, + }, + redirect: { + home: '/onlogin', + login: '/auth/login', + logout: '/auth/login', + }, + storage: { + driver: 'cookie', + }, + logout: { + graphqlQuery: { + query: ` + mutation logout { + logout + } + `, + variables: {}, + operationName: 'logout', + }, + }, + // TODO: apiType ismi yapilacak + restApiType: 'graphql', + } as AuthOptions + const auth = AuthClient({ axios, options: customOptions }) + + return auth +} +export default useAuth diff --git a/apps/vue-admin/src/composables/get-theme.ts b/apps/vue-admin/src/composables/get-theme.ts new file mode 100644 index 00000000..1f959c37 --- /dev/null +++ b/apps/vue-admin/src/composables/get-theme.ts @@ -0,0 +1,17 @@ +import { SelectedTheme } from 'vue-app/types' +import { useUserStore } from '~/stores/useUserStore' + +export const changeLocalStoreTheme = (select: SelectedTheme) => { + const userStore = useUserStore() + localStorage.setItem('vueuse-color-scheme', select) + if (select === 'dark') { + document.documentElement.classList.remove('light') + document.documentElement.classList.add('dark') + userStore.changeTheme('dark') + } + else if (select === 'light') { + document.documentElement.classList.remove('dark') + document.documentElement.classList.add('light') + userStore.changeTheme('light') + } +} diff --git a/apps/vue-admin/src/layouts/default.vue b/apps/vue-admin/src/layouts/default.vue new file mode 100644 index 00000000..94ca203e --- /dev/null +++ b/apps/vue-admin/src/layouts/default.vue @@ -0,0 +1,129 @@ + + + diff --git a/apps/vue-admin/src/layouts/user.vue b/apps/vue-admin/src/layouts/user.vue new file mode 100644 index 00000000..1ec01db0 --- /dev/null +++ b/apps/vue-admin/src/layouts/user.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/apps/vue-admin/src/main.ts b/apps/vue-admin/src/main.ts new file mode 100644 index 00000000..a529fa12 --- /dev/null +++ b/apps/vue-admin/src/main.ts @@ -0,0 +1,83 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import axios from 'axios' +import 'uno.css' +import './assets/base.css' +import { createHead } from '@vueuse/head' +import { onMessage } from 'firebase/messaging' +import router, { routes } from './router' +import { messaging } from './services/notifications' +import App from './App.vue' +// import { onMessage } from 'firebase/messaging' +// import { messaging } from './services/notifications' + +const meta = document.createElement('meta') +meta.name = 'naive-ui-style' +document.head.appendChild(meta) +const head = createHead() + +const pinia = createPinia() +const app = createApp(App).use(router).use(pinia).use(head) +async function init() { + try { + Object.values(import.meta.glob('./modules/*.ts', { eager: true })).map((i: any) => + i.install?.({ app, router, routes, pinia, axios }), + ) + + router.isReady().then(() => { + app.mount('#app') + }) + app.config.unwrapInjectedRef = true + + // await registerSW({ immediate: true })(true); + } + catch (e) { + console.error(e) + } + finally { + // eslint-disable-next-line no-console + console.log('init') + } +} +if (import.meta.hot) + import.meta.hot.accept() + +init() +onMessage(messaging, (payload) => { + if (payload.notification === undefined) + return + + // console.log(payload.data) + const notificationData = payload + + // eslint-disable-next-line no-console + console.log( + '[firebase-messaging-sw.js] Received foreground message ', + notificationData, + ) + const { tSuccess } = usePWebNotification() + if (notificationData.data) + tSuccess({ title: notificationData.data.title, description: notificationData.data.body }) + + const { title, body } = notificationData.data as { title: string; body: string } + const notificationTitle = title + const notificationOptions = { + body, + icon: '/logo-dark.png', + } + + navigator.serviceWorker.ready.then((registration) => { + registration + .showNotification(notificationTitle, notificationOptions) + .then(() => { + // eslint-disable-next-line no-console + console.log('[firebase-messaging-sw.js] Notification shown') + }) + .catch((error) => { + console.error( + '[firebase-messaging-sw.js] Error showing notification', + error, + ) + }) + }) +}) diff --git a/apps/vue-admin/src/modules/apollo-graphql.ts b/apps/vue-admin/src/modules/apollo-graphql.ts new file mode 100644 index 00000000..385d7da1 --- /dev/null +++ b/apps/vue-admin/src/modules/apollo-graphql.ts @@ -0,0 +1,187 @@ +import { + ApolloClient, + ApolloLink, + FetchResult, + Observable, + Operation, + fromPromise, + split, +} from '@apollo/client/core' +import { InMemoryCache } from '@apollo/client/cache' +import { setContext } from '@apollo/client/link/context' +import { onError } from '@apollo/client/link/error' +import { createUploadLink } from 'apollo-upload-client' +import type { Client } from 'graphql-ws' +import { createClient } from 'graphql-ws' +import { DefaultApolloClient } from '@vue/apollo-composable' +import { asyncMap, getMainDefinition } from '@apollo/client/utilities' +import { createPersistedQueryLink } from '@apollo/client/link/persisted-queries' +import sha256 from 'crypto-js/sha256' +import { AppModule } from 'vue-app/types' +import { print } from 'graphql' +import { useAuth } from '~/composables/auth' +const uri = import.meta.env.VITE_GRAPHQL_ENDPOINT +const socket = import.meta.env.VITE_GRAPHQL_ENDPOINT_WS + +const ip = import.meta.env.VITE_SERVER_URL +const dev = import.meta.env.dev + +class WebSocketLink extends ApolloLink { + private client: Client + + constructor(client: Client) { + super() + this.client = client + } + + public request(operation: Operation): Observable { + return new Observable((observer) => { + return this.client.subscribe( + { + ...operation, + query: print(operation.query), + }, + { + next: observer.next.bind(observer), + complete: observer.complete.bind(observer), + error: observer.error.bind(observer), + }, + ) + }) + } +} + +// Create the subscription websocket link +const wsClient = createClient({ + // url: `${window.location.protocol === 'https:' ? 'wss:' : 'ws:'}//${ + // window.location.host + // }/api`, + url: socket || `ws://${ip}:4000/subscriptions`, + isFatalConnectionProblem: () => false, + retryAttempts: Infinity, +}) + +// avoid duplicated online/offline event +let isOnline = false +wsClient.on('opened', () => { + if (isOnline) + return + + // events.online.dispatchEvent() + isOnline = true +}) +wsClient.on('closed', () => { + if (!isOnline) + return + + isOnline = false + // events.offline.dispatchEvent() +}) +const wsLink = new WebSocketLink(wsClient) + +const httpLink = createUploadLink({ + uri: uri || `http://${ip}:4000/graphql`, + credentials: 'same-origin', +}) + +const apqLink = createPersistedQueryLink({ + sha256: i => sha256(i).toString(), +}) + +const authMiddleware = new ApolloLink((operation, forward) => { + const { token } = operation.getContext() + console.log(operation.getContext()) + operation.setContext(() => ({ + headers: { + Authorization: token ? `Bearer ${token}` : '', + }, + })) + return forward(operation) +}) +const splitLink = () => { + return split( + ({ query }) => { + const definition = getMainDefinition(query) + return ( + definition.kind === 'OperationDefinition' + && definition.operation === 'subscription' + ) + }, + authMiddleware.concat(wsLink), + authMiddleware.concat(httpLink), + ) +} + +const errorHandler = () => { + const { refreshToken } = useAuth() + return onError(({ graphQLErrors, networkError, operation, forward }): any => { + if (graphQLErrors) { + for (const err of graphQLErrors) { + switch (err.message) { + case 'Unauthorized': + return fromPromise(refreshToken()) + .filter(value => Boolean(value)) + .flatMap((accessToken) => { + const oldHeaders = operation.getContext().headers + + // modify the operation context with a new token + operation.setContext({ + headers: { + ...oldHeaders, + authorization: `Bearer ${accessToken}`, + }, + }) + return forward(operation) + }) + case 'FORBIDDEN': + // changeAppAccess(false) + break + default: + if (dev) { + // eslint-disable-next-line no-console + console.log(graphQLErrors, 'graphQLErrors') + } + useToast(err.message, { color: 'warning' }) + return forward(operation) + } + } + } + else { + // changeAppAccess(true) + } + + if (networkError) { + // eslint-disable-next-line no-console + console.log(`[Network error]: ${networkError}`) + } + return null + }) +} + +const withToken = setContext(async () => { + const { getToken } = useAuth() + const token = await getToken() + return { token } +}) +// Cache implementation +const cache = new InMemoryCache({ + addTypename: false, +}) + +function apolloClient() { + return new ApolloClient({ + link: ApolloLink.from([withToken, errorHandler(), splitLink()]), + cache, + connectToDevTools: !!dev, + }) +} +export { apolloClient } + +export const install: AppModule = ({ app }) => { + const apolloClient = new ApolloClient({ + link: ApolloLink.from([withToken, errorHandler(), splitLink()]), + cache, + connectToDevTools: !!dev, + }) + app.provide(DefaultApolloClient, apolloClient) +} diff --git a/apps/vue-admin/src/modules/i18n.ts b/apps/vue-admin/src/modules/i18n.ts new file mode 100644 index 00000000..2b8c8a07 --- /dev/null +++ b/apps/vue-admin/src/modules/i18n.ts @@ -0,0 +1,16 @@ +import { createI18n } from 'vue-i18n' + +import messages from '@intlify/vite-plugin-vue-i18n/messages' +import { AppModule } from 'vue-app/types' + +export const monoRepoI18n = createI18n({ + legacy: false, + locale: 'en-US', + fallbackLocale: 'en-US', + messages, + fallbackWarn: false, +}) + +export const install: AppModule = ({ app }) => { + app.use(monoRepoI18n) +} diff --git a/apps/vue-admin/src/pages/[username]/index.vue b/apps/vue-admin/src/pages/[username]/index.vue new file mode 100644 index 00000000..f00f3dc5 --- /dev/null +++ b/apps/vue-admin/src/pages/[username]/index.vue @@ -0,0 +1,48 @@ + +meta: + auth: user + layout: user + + + + + diff --git a/apps/vue-admin/src/pages/auth/forgot.vue b/apps/vue-admin/src/pages/auth/forgot.vue new file mode 100644 index 00000000..63aaba28 --- /dev/null +++ b/apps/vue-admin/src/pages/auth/forgot.vue @@ -0,0 +1,100 @@ + +meta: + auth: self + + + + + diff --git a/apps/vue-admin/src/pages/auth/login.vue b/apps/vue-admin/src/pages/auth/login.vue new file mode 100644 index 00000000..ea45c918 --- /dev/null +++ b/apps/vue-admin/src/pages/auth/login.vue @@ -0,0 +1,168 @@ + +meta: + auth: self + + + + + diff --git a/apps/vue-admin/src/pages/auth/signup.vue b/apps/vue-admin/src/pages/auth/signup.vue new file mode 100644 index 00000000..7a44eb08 --- /dev/null +++ b/apps/vue-admin/src/pages/auth/signup.vue @@ -0,0 +1,180 @@ + +meta: + auth: self + + + + + diff --git a/apps/vue-admin/src/pages/index.vue b/apps/vue-admin/src/pages/index.vue new file mode 100644 index 00000000..a62d08a4 --- /dev/null +++ b/apps/vue-admin/src/pages/index.vue @@ -0,0 +1,430 @@ + +meta: + auth: guest + + + + + diff --git a/apps/vue-admin/src/pages/onlogin.vue b/apps/vue-admin/src/pages/onlogin.vue new file mode 100644 index 00000000..c9863e59 --- /dev/null +++ b/apps/vue-admin/src/pages/onlogin.vue @@ -0,0 +1,18 @@ + + + diff --git a/apps/vue-admin/src/router.ts b/apps/vue-admin/src/router.ts new file mode 100644 index 00000000..c69e80db --- /dev/null +++ b/apps/vue-admin/src/router.ts @@ -0,0 +1,47 @@ +import { + NavigationGuard, + NavigationHookAfter, + createRouter, + createWebHistory, +} from 'vue-router' +import { isSupportedLocale } from 'vue-app/utils' +import * as NProgress from 'nprogress' +import { useCookies } from '@vueuse/integrations/useCookies' + +/** + * routes are generated using vite-plugin-pages + * each .vue files located in the ./src/pages are registered as a route + * @see https://github.com/hannoeru/vite-plugin-pages/blob/main/examples/vue/src/main.ts + */ + +import { setupLayouts } from 'virtual:generated-layouts' +import generatedRoutes from 'virtual:generated-pages' +import { setLanguage } from '../locales/set-language' +import availableLanguages from '../locales/available-languages.json' +import { monoRepoI18n } from './modules/i18n' + +export const routes = setupLayouts(generatedRoutes) + +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +/** + * Handle NProgress display on page changes + */ +export const onBeforeEach: NavigationGuard = async () => { + NProgress.start() + const cookies = useCookies(['locale']) + + if (isSupportedLocale(cookies.get('locale'), availableLanguages)) + setLanguage(cookies.get('locale'), monoRepoI18n) +} + +export const afterEach: NavigationHookAfter = async () => { + NProgress.done(true) +} +router.beforeEach(onBeforeEach) +router.afterEach(afterEach) + +export default router diff --git a/apps/vue-admin/src/services/notifications.ts b/apps/vue-admin/src/services/notifications.ts new file mode 100644 index 00000000..ce1e7a53 --- /dev/null +++ b/apps/vue-admin/src/services/notifications.ts @@ -0,0 +1,55 @@ +/* eslint-disable no-console */ +import { getMessaging, getToken } from 'firebase/messaging' +import { initializeApp } from 'firebase/app' +import { CreateTokenNotificationDocument } from '@oku/api/node-graphql' +import { apolloClient } from '~/modules/apollo-graphql' +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries + +// Your web app's Firebase configuration +const firebaseConfig = import.meta.env.VITE_FIREBASE_CONFIG + +const registerToken = async (token: string) => { + console.log(`Push registration success, token: ${token}`) + const { errors } = await apolloClient.mutate({ + mutation: CreateTokenNotificationDocument, + variables: { + data: { + token, + deviceId: '', + }, + }, + }) + if (errors) + console.error('error registration', errors) +} +const app = initializeApp(JSON.parse(firebaseConfig as string)) +export const messaging = getMessaging(app) +export const initNotif = () => { + console.log('register web', firebaseConfig) + getToken(messaging, { vapidKey: import.meta.env.VITE_VAPID_KEY as string }) + .then(async (currentToken) => { + if (currentToken) { + // Send the token to your server and update the UI if necessary + // ... + console.log('token', currentToken) + try { + await registerToken(currentToken) + } + catch (e) { + console.error(e) + } + } + else { + // Show permission request UI + console.log( + 'No registration token available. Request permission to generate one.', + ) + // ... + } + }) + .catch((err) => { + console.log('An error occurred while retrieving token. ', err) + // ... + }) +} diff --git a/apps/vue-admin/src/shims-vue.d.ts b/apps/vue-admin/src/shims-vue.d.ts new file mode 100644 index 00000000..e2f7795b --- /dev/null +++ b/apps/vue-admin/src/shims-vue.d.ts @@ -0,0 +1,23 @@ +/// +/// +/// + +declare module '*.vue' { + import {DefineComponent} from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} + + +interface ImportMetaEnv { + readonly VITE_GRAPHQL_ENDPOINT: string + readonly VITE_GRAPHQL_ENDPOINT_WS: string + readonly VITE_SENTRY_DNS: string + readonly NODE_ENV: string + readonly VITE_SENTRY_ENVIRONMENT: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} \ No newline at end of file diff --git a/apps/vue-admin/src/stores/useAppStore.ts b/apps/vue-admin/src/stores/useAppStore.ts new file mode 100644 index 00000000..2c264fbc --- /dev/null +++ b/apps/vue-admin/src/stores/useAppStore.ts @@ -0,0 +1,43 @@ +import { defineStore } from 'pinia' + +export const useAppStore = defineStore({ + id: 'appStore', + state: () => ({ + progressRouter: false, + sidebarOpen: false, + stutus: '' as 'writing' | 'reading' | 'null', + fullScreen: false, + hydrated: false, + hydrating: false, + error: null, + authenticated: false, + accessTokenExpiry: 0, + appAccess: true, + basemap: 'OpenStreetMap', + isModalWindow: false, + userLayoutSmall: false, + }), + getters: { + getProgressRouter: state => state.progressRouter, + isSidebar: state => state.sidebarOpen, + getStatus: state => state.stutus, + }, + actions: { + async hydrate() {}, + changeAppAccess(value: boolean) { + this.appAccess = value + }, + changeSidebar(value?: boolean) { + if (value === undefined) + this.sidebarOpen = !this.sidebarOpen + else + this.sidebarOpen = value + }, + changeIsModalWindow(value: boolean) { + this.isModalWindow = value + }, + changeUserLayoutSmall(value: boolean) { + this.userLayoutSmall = value + }, + }, +}) diff --git a/apps/vue-admin/src/stores/useUserStore.ts b/apps/vue-admin/src/stores/useUserStore.ts new file mode 100644 index 00000000..f1a16fd7 --- /dev/null +++ b/apps/vue-admin/src/stores/useUserStore.ts @@ -0,0 +1,34 @@ +import { defineStore } from 'pinia' +import { typeDark } from 'vue-app/types' +import { GetUserInfoQuery } from '@oku/api' +import { apolloClient } from '~/modules/apollo-graphql' +export const useUserStore = defineStore({ + id: 'userStore', + state: () => ({ + user: {} as GetUserInfoQuery['me'], + currentUser: null, + reading: null, + isOrganization: false, + loading: false, + userLanguage: '3e875cca-5297-44ac-a3c4-0e8199932268', + error: null, + remember: true, + timeReading: 0, + theme: 'light' as typeDark, + }), + getters: {}, + actions: { + async onInit() { + await this.getUser() + return true + }, + changeTheme(theme: typeDark) { + this.theme = theme + }, + async getUser() { + const { data } = await apolloClient().query({ query: GetUserInfoDocument }) + if (data) + this.user = data.me + }, + }, +}) diff --git a/apps/vue-admin/src/utils/use-popper.ts b/apps/vue-admin/src/utils/use-popper.ts new file mode 100644 index 00000000..ef08c880 --- /dev/null +++ b/apps/vue-admin/src/utils/use-popper.ts @@ -0,0 +1,34 @@ +import { onMounted, ref, watchEffect } from 'vue' +import { Modifier, OptionsGeneric, createPopper } from '@popperjs/core' + +export function usePopper( + options: Partial>>> | undefined, +) { + const reference = ref(null) + const popper = ref(null) + + onMounted(() => { + watchEffect((onInvalidate) => { + if (!popper.value) + return + + if (!reference.value) + return + + const popperEl = popper.value.el || popper.value + const referenceEl = reference.value.el || reference.value + + if (!(referenceEl instanceof HTMLElement)) + return + + if (!(popperEl instanceof HTMLElement)) + return + + const { destroy } = createPopper(referenceEl, popperEl, options) + + onInvalidate(destroy) + }) + }) + + return [reference, popper] +} diff --git a/apps/vue-admin/tailwind.config.js b/apps/vue-admin/tailwind.config.js new file mode 100644 index 00000000..ef3cdca7 --- /dev/null +++ b/apps/vue-admin/tailwind.config.js @@ -0,0 +1,33 @@ +/** @type {import('tailwindcss/types').Config} */ + +const defaultTheme = require('tailwindcss/defaultTheme') + +module.exports = { + darkMode: 'class', // or 'media' or 'class' + content: [ + './index.html', + './src/**/*.{vue,js,ts,jsx,tsx}', + '../../packages/vue-design-system/**/*.{js,ts,jsx,tsx,vue}', + ], + theme: { + extend: { + colors: { + dark: { + 100: '#222', + 200: '#333', + 300: '#444', + 400: '#555', + 500: '#666', + 600: '#777', + 700: '#888', + 800: '#999', + 900: '#aaa', + }, + }, + fontFamily: { + sans: ['Inter var', ...defaultTheme.fontFamily.sans], + }, + }, + }, + plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')], +} diff --git a/apps/vue-admin/tsconfig.json b/apps/vue-admin/tsconfig.json new file mode 100644 index 00000000..4d731b41 --- /dev/null +++ b/apps/vue-admin/tsconfig.json @@ -0,0 +1,48 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "ESNext", + "lib": [ + "DOM", + "ESNext", + "WebWorker" + ], + "strict": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "resolveJsonModule": true, + "noUnusedLocals": true, + "strictNullChecks": true, + "forceConsistentCasingInFileNames": true, + "target": "esnext", + "types": [ + "vue", + "node", + "vite/client", + "vite-plugin-pages/client", + "vite-plugin-vue-layouts/client", + "vite-plugin-pwa/client", + "@intlify/vite-plugin-vue-i18n/client", + "naive-ui/volar", + "vite-plugin-glob/client" + ], + "jsx": "preserve", + "skipLibCheck": true, + "allowJs": true, + "paths": { + "~/*": [ + "src/*" + ], + "#root": [ + "./" + ], + } + }, + "exclude": [ + "node_modules", + "dist", + "**/*.worker.ts", + "dev-dist", + "*.js" + ], +} \ No newline at end of file diff --git a/apps/vue-admin/tsconfig.node.json b/apps/vue-admin/tsconfig.node.json new file mode 100644 index 00000000..9f49c17a --- /dev/null +++ b/apps/vue-admin/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "extends": "@oku/tsconfig/vue.json", + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "node" + }, + "include": ["vite.config.ts"] +} diff --git a/apps/vue-admin/vite.config.ts b/apps/vue-admin/vite.config.ts new file mode 100644 index 00000000..3e65511d --- /dev/null +++ b/apps/vue-admin/vite.config.ts @@ -0,0 +1,140 @@ +import { resolve } from 'path' +import { defineConfig } from 'vite' + +import Vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite' +import VueI18n from '@intlify/vite-plugin-vue-i18n' +import AutoImport from 'unplugin-auto-import/vite' +import Unocss from 'unocss/vite' +import { presetIcons } from 'unocss' +import Pages from 'vite-plugin-pages' +import Layouts from 'vite-plugin-vue-layouts' +import { VitePWA } from 'vite-plugin-pwa' +import { + HeadlessUiResolver, + NaiveUiResolver, +} from 'unplugin-vue-components/resolvers' + +export default defineConfig({ + resolve: { + alias: { + '~/': `${resolve(__dirname, 'src')}/`, + }, + }, + plugins: [ + Vue(), + + // https://github.com/hannoeru/vite-plugin-pages + Pages({ extensions: ['vue'] }), + + // https://github.com/JohnCampionJr/vite-plugin-vue-layouts + Layouts(), + + // https://github.com/antfu/unplugin-auto-import + AutoImport({ + imports: [ + 'vue', + 'vue-router', + 'vue-i18n', + '@vueuse/head', + '@vueuse/core', + 'vee-validate', + 'pinia', + ], + resolvers: [NaiveUiResolver()], + dirs: [ + './src/composables/', + '../../packages/vue-app/composables/', + './src/stores/', + '../../packages/oku-api/types/', + ], + dts: './src/auto-imports.d.ts', + eslintrc: { + enabled: true, + }, + vueTemplate: true, + }), + + // https://github.com/antfu/unplugin-vue-components + Components({ + dirs: [ + '../../packages/vue-design-system/components/', + './src/components/', + ], + // allow auto load markdown components under `./src/components/` + extensions: ['vue'], + // allow auto import and register components used in markdown + include: [/\.vue$/, /\.vue\?vue/], + exclude: [ + /[\\/]node_modules[\\/]/, + /[\\/]\.git[\\/]/, + /[\\/]\.nuxt[\\/]/, + ], + directoryAsNamespace: true, + + // custom resolvers + resolvers: [HeadlessUiResolver(), NaiveUiResolver()], + + dts: 'src/components.d.ts', + }), + + Unocss({ + presets: [ + presetIcons({ + scale: 1.2, + extraProperties: { + display: 'inline-block', + }, + prefix: 'i-', + }), + ], + safelist: [ + 'i-ph-laptop-duotone', + 'i-ph-moon-stars-duotone', + 'i-ph-sun-dim-duotone', + ], + }), + + // https://github.com/intlify/bundle-tools/tree/main/packages/vite-plugin-vue-i18n + VueI18n({ + runtimeOnly: true, + compositionOnly: true, + include: [resolve(__dirname, 'locales/**')], + }), + + // https://github.com/antfu/vite-plugin-pwa + VitePWA({ + registerType: 'autoUpdate', + includeAssets: [ + 'favicon.svg', + 'favicon.ico', + 'robots.txt', + 'safari-pinned-tab.svg', + ], + injectRegister: 'auto', + manifest: { + name: 'productdevbook', + short_name: 'productdevbook', + theme_color: '#267866', + icons: [ + { + src: '/pwa-192x192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: '/pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + }, + { + src: '/pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any maskable', + }, + ], + }, + }), + ], +}) diff --git a/package.json b/package.json index 97ea1377..1f9367ef 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "dev:vue-storybook": "turbo run dev --parallel --no-cache --filter=@productdevbook/storybook-vue", "dev:web": "turbo run dev --parallel --no-cache --filter=vue-web --filter=@oku/api --filter=app-nestjs --filter=oku-i18n", "dev:mobile": "turbo run dev --parallel --no-cache --filter=vue-mobile --filter=@oku/api --filter=app-nestjs --filter=oku-i18n", + "dev:admin": "turbo run dev --parallel --no-cache --filter=vue-admin --filter=@oku/api --filter=app-nestjs --filter=oku-i18n", "dev:ui:web": "turbo run dev --parallel --no-cache --filter=vue-web --filter=@productdevbook/storybook-vue", "dev:ui:mobile": "turbo run dev --parallel --no-cache --filter=vue-mobile --filter=@productdevbook/storybook-vue", "dev:nestjs": "turbo run dev --filter=app-nestjs", @@ -57,7 +58,8 @@ "@productdevbook/email": "workspace:*", "app-nestjs": "workspace:*", "vue-mobile": "workspace:*", - "vue-web": "workspace:*" + "vue-web": "workspace:*", + "vue-admin": "workspace:*" }, "packageManager": "pnpm@7.6.0", "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d97c1ada..b8fb634f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,7 @@ importers: sass: 1.54.0 turbo: 1.3.4 unbuild: 0.7.6 + vue-admin: workspace:* vue-app: workspace:* vue-design-system: workspace:* vue-mobile: workspace:* @@ -52,6 +53,7 @@ importers: sass: 1.54.0 turbo: 1.3.4 unbuild: 0.7.6 + vue-admin: link:apps/vue-admin vue-app: link:packages/vue-app vue-design-system: link:packages/vue-design-system vue-mobile: link:apps/vue-mobile @@ -253,6 +255,117 @@ importers: ts-node: 10.9.1_zgusdg2syqzg2kik2gzyf5b6di tsconfig-paths: 4.0.0 + apps/vue-admin: + specifiers: + '@antfu/eslint-config': 0.25.2 + '@apollo/client': 3.6.9 + '@headlessui/vue': 1.6.7 + '@intlify/vite-plugin-vue-i18n': 5.0.1 + '@oku/api': workspace:* + '@oku/config': workspace:* + '@oku/tsconfig': workspace:* + '@popperjs/core': 2.11.5 + '@productdevbook/auth': 0.2.1 + '@tailwindcss/forms': 0.5.2 + '@tailwindcss/typography': 0.5.4 + '@types/apollo-upload-client': 17.0.1 + '@types/crypto-js': 4.1.1 + '@types/js-cookie': 3.0.2 + '@types/nprogress': 0.2.0 + '@vee-validate/i18n': 4.6.2 + '@vitejs/plugin-vue': 3.0.1 + '@vue/apollo-composable': 4.0.0-alpha.19 + '@vueuse/core': 8.9.4 + '@vueuse/head': 0.7.7 + '@vueuse/integrations': 8.9.4 + apollo-upload-client: 17.0.0 + autoprefixer: 10.4.7 + crypto-js: 4.1.1 + eslint: 8.20.0 + firebase: 9.9.1 + got: 12.2.0 + graphql: 16.5.0 + graphql-ws: 5.9.1 + gsap: 3.10.4 + naive-ui: 2.31.0 + nprogress: 0.2.0 + oku-i18n: workspace* + pinia: 2.0.16 + postcss: 8.4.14 + tailwindcss: 3.1.6 + typescript: 4.7.4 + universal-cookie: 4.0.4 + unocss: 0.44.7 + unplugin-auto-import: 0.10.1 + unplugin-vue-components: 0.21.1 + vite: 3.0.3 + vite-plugin-glob: 0.3.2 + vite-plugin-pages: 0.25.0 + vite-plugin-pwa: 0.12.3 + vite-plugin-vue-layouts: 0.7.0 + vue: 3.2.37 + vue-app: workspace:* + vue-design-system: workspace:* + vue-i18n: 9.2.0-beta.40 + vue-router: 4.1.2 + vue-tsc: 0.39.0 + yup: 0.32.11 + dependencies: + '@apollo/client': 3.6.9_nrmqddr6fropr2zq2g6vz5wafe + '@headlessui/vue': 1.6.7_vue@3.2.37 + '@intlify/vite-plugin-vue-i18n': 5.0.1_e4cmfr2yyq6ehuyzd34qpsi4km + '@oku/api': link:../../packages/oku-api + '@popperjs/core': 2.11.5 + '@productdevbook/auth': 0.2.1 + '@vee-validate/i18n': 4.6.2 + '@vue/apollo-composable': 4.0.0-alpha.19_ga3iooe4t6afr6kongbdyporqi + '@vueuse/core': 8.9.4_vue@3.2.37 + '@vueuse/head': 0.7.7_vue@3.2.37 + '@vueuse/integrations': 8.9.4_4pgchygqajge3gfa4qy5gts7ti + apollo-upload-client: 17.0.0_si36fci2ot5w4cao4jlfzf5er4 + crypto-js: 4.1.1 + firebase: 9.9.1 + got: 12.2.0 + graphql: 16.5.0 + graphql-ws: 5.9.1_graphql@16.5.0 + gsap: 3.10.4 + nprogress: 0.2.0 + oku-i18n: link:../../packages/oku-i18n + pinia: 2.0.16_j6bzmzd4ujpabbp5objtwxyjp4 + universal-cookie: 4.0.4 + unocss: 0.44.7_vite@3.0.3 + unplugin-auto-import: 0.10.1_ast4kmefllg5fcmw2swrbuhaxq + unplugin-vue-components: 0.21.1_vite@3.0.3+vue@3.2.37 + vite-plugin-pages: 0.25.0_vite@3.0.3 + vite-plugin-vue-layouts: 0.7.0_z3wofnvexstekwaykj47orp6tq + vue: 3.2.37 + vue-app: link:../../packages/vue-app + vue-design-system: link:../../packages/vue-design-system + vue-i18n: 9.2.0-beta.40_vue@3.2.37 + vue-router: 4.1.2_vue@3.2.37 + yup: 0.32.11 + devDependencies: + '@antfu/eslint-config': 0.25.2_he2ccbldppg44uulnyq4rwocfa + '@oku/config': link:../../packages/oku-config + '@oku/tsconfig': link:../../packages/oku-tsconfig + '@tailwindcss/forms': 0.5.2_tailwindcss@3.1.6 + '@tailwindcss/typography': 0.5.4_tailwindcss@3.1.6 + '@types/apollo-upload-client': 17.0.1_graphql-ws@5.9.1 + '@types/crypto-js': 4.1.1 + '@types/js-cookie': 3.0.2 + '@types/nprogress': 0.2.0 + '@vitejs/plugin-vue': 3.0.1_vite@3.0.3+vue@3.2.37 + autoprefixer: 10.4.7_postcss@8.4.14 + eslint: 8.20.0 + naive-ui: 2.31.0_vue@3.2.37 + postcss: 8.4.14 + tailwindcss: 3.1.6 + typescript: 4.7.4 + vite: 3.0.3 + vite-plugin-glob: 0.3.2 + vite-plugin-pwa: 0.12.3_vite@3.0.3 + vue-tsc: 0.39.0_typescript@4.7.4 + apps/vue-mobile: specifiers: '@antfu/eslint-config': 0.25.2 @@ -740,7 +853,7 @@ packages: - chokidar dev: true - /@antfu/eslint-config-basic/0.25.2_2vt5mtrqleafs33qg2bhpmbaqm: + /@antfu/eslint-config-basic/0.25.2_bao7xq2p45jpdplvjvt3gxqp3m: resolution: {integrity: sha512-D81jE90B7cujMmU2mKEaUcRsKRAfVX4PniEoaD0c3HiqprqghfBjuv3B6p1+tG9uJQAgLBVsK+G92Y+AAgFaOA==} peerDependencies: eslint: '>=7.4.0' @@ -749,7 +862,7 @@ packages: eslint-plugin-antfu: 0.25.2_4x5o4skxv6sl53vpwefgt23khm eslint-plugin-eslint-comments: 3.2.0_eslint@8.19.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_rywvbqnelbznwddhxv2glfjuay + eslint-plugin-import: 2.26.0_slugmiwpezfkvxhcmtxfzhclxe eslint-plugin-jsonc: 2.3.1_eslint@8.19.0 eslint-plugin-markdown: 2.2.1_eslint@8.19.0 eslint-plugin-n: 15.2.4_eslint@8.19.0 @@ -766,7 +879,7 @@ packages: - typescript dev: true - /@antfu/eslint-config-basic/0.25.2_b7n364ggt6o4xlkgyoaww3ph3q: + /@antfu/eslint-config-basic/0.25.2_d5zwcxr4bwkhmuo464cb3a2puu: resolution: {integrity: sha512-D81jE90B7cujMmU2mKEaUcRsKRAfVX4PniEoaD0c3HiqprqghfBjuv3B6p1+tG9uJQAgLBVsK+G92Y+AAgFaOA==} peerDependencies: eslint: '>=7.4.0' @@ -775,7 +888,7 @@ packages: eslint-plugin-antfu: 0.25.2_he2ccbldppg44uulnyq4rwocfa eslint-plugin-eslint-comments: 3.2.0_eslint@8.20.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_y5cwkwncsnk6w3wfynadgn7abe + eslint-plugin-import: 2.26.0_ficupzxy3q6nk56ibvavehtzue eslint-plugin-jsonc: 2.3.1_eslint@8.20.0 eslint-plugin-markdown: 2.2.1_eslint@8.20.0 eslint-plugin-n: 15.2.4_eslint@8.20.0 @@ -792,22 +905,22 @@ packages: - typescript dev: true - /@antfu/eslint-config-basic/0.25.2_rywvbqnelbznwddhxv2glfjuay: + /@antfu/eslint-config-basic/0.25.2_ficupzxy3q6nk56ibvavehtzue: resolution: {integrity: sha512-D81jE90B7cujMmU2mKEaUcRsKRAfVX4PniEoaD0c3HiqprqghfBjuv3B6p1+tG9uJQAgLBVsK+G92Y+AAgFaOA==} peerDependencies: eslint: '>=7.4.0' dependencies: - eslint: 8.19.0 - eslint-plugin-antfu: 0.25.2_eslint@8.19.0 - eslint-plugin-eslint-comments: 3.2.0_eslint@8.19.0 + eslint: 8.20.0 + eslint-plugin-antfu: 0.25.2_eslint@8.20.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@8.20.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_rywvbqnelbznwddhxv2glfjuay - eslint-plugin-jsonc: 2.3.1_eslint@8.19.0 - eslint-plugin-markdown: 2.2.1_eslint@8.19.0 - eslint-plugin-n: 15.2.4_eslint@8.19.0 - eslint-plugin-promise: 6.0.0_eslint@8.19.0 - eslint-plugin-unicorn: 42.0.0_eslint@8.19.0 - eslint-plugin-yml: 1.0.0_eslint@8.19.0 + eslint-plugin-import: 2.26.0_ficupzxy3q6nk56ibvavehtzue + eslint-plugin-jsonc: 2.3.1_eslint@8.20.0 + eslint-plugin-markdown: 2.2.1_eslint@8.20.0 + eslint-plugin-n: 15.2.4_eslint@8.20.0 + eslint-plugin-promise: 6.0.0_eslint@8.20.0 + eslint-plugin-unicorn: 42.0.0_eslint@8.20.0 + eslint-plugin-yml: 1.0.0_eslint@8.20.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 transitivePeerDependencies: @@ -818,22 +931,22 @@ packages: - typescript dev: true - /@antfu/eslint-config-basic/0.25.2_y5cwkwncsnk6w3wfynadgn7abe: + /@antfu/eslint-config-basic/0.25.2_slugmiwpezfkvxhcmtxfzhclxe: resolution: {integrity: sha512-D81jE90B7cujMmU2mKEaUcRsKRAfVX4PniEoaD0c3HiqprqghfBjuv3B6p1+tG9uJQAgLBVsK+G92Y+AAgFaOA==} peerDependencies: eslint: '>=7.4.0' dependencies: - eslint: 8.20.0 - eslint-plugin-antfu: 0.25.2_eslint@8.20.0 - eslint-plugin-eslint-comments: 3.2.0_eslint@8.20.0 + eslint: 8.19.0 + eslint-plugin-antfu: 0.25.2_eslint@8.19.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@8.19.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_y5cwkwncsnk6w3wfynadgn7abe - eslint-plugin-jsonc: 2.3.1_eslint@8.20.0 - eslint-plugin-markdown: 2.2.1_eslint@8.20.0 - eslint-plugin-n: 15.2.4_eslint@8.20.0 - eslint-plugin-promise: 6.0.0_eslint@8.20.0 - eslint-plugin-unicorn: 42.0.0_eslint@8.20.0 - eslint-plugin-yml: 1.0.0_eslint@8.20.0 + eslint-plugin-import: 2.26.0_slugmiwpezfkvxhcmtxfzhclxe + eslint-plugin-jsonc: 2.3.1_eslint@8.19.0 + eslint-plugin-markdown: 2.2.1_eslint@8.19.0 + eslint-plugin-n: 15.2.4_eslint@8.19.0 + eslint-plugin-promise: 6.0.0_eslint@8.19.0 + eslint-plugin-unicorn: 42.0.0_eslint@8.19.0 + eslint-plugin-yml: 1.0.0_eslint@8.19.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 transitivePeerDependencies: @@ -910,9 +1023,9 @@ packages: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.25.2_2vt5mtrqleafs33qg2bhpmbaqm - '@typescript-eslint/eslint-plugin': 5.30.6_2vt5mtrqleafs33qg2bhpmbaqm - '@typescript-eslint/parser': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@antfu/eslint-config-basic': 0.25.2_bao7xq2p45jpdplvjvt3gxqp3m + '@typescript-eslint/eslint-plugin': 5.31.0_bao7xq2p45jpdplvjvt3gxqp3m + '@typescript-eslint/parser': 5.31.0_4x5o4skxv6sl53vpwefgt23khm eslint: 8.19.0 typescript: 4.7.4 transitivePeerDependencies: @@ -927,9 +1040,9 @@ packages: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.25.2_rywvbqnelbznwddhxv2glfjuay - '@typescript-eslint/eslint-plugin': 5.30.6_rywvbqnelbznwddhxv2glfjuay - '@typescript-eslint/parser': 5.30.6_eslint@8.19.0 + '@antfu/eslint-config-basic': 0.25.2_slugmiwpezfkvxhcmtxfzhclxe + '@typescript-eslint/eslint-plugin': 5.31.0_slugmiwpezfkvxhcmtxfzhclxe + '@typescript-eslint/parser': 5.31.0_eslint@8.19.0 eslint: 8.19.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -943,9 +1056,9 @@ packages: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.25.2_y5cwkwncsnk6w3wfynadgn7abe - '@typescript-eslint/eslint-plugin': 5.30.6_y5cwkwncsnk6w3wfynadgn7abe - '@typescript-eslint/parser': 5.30.6_eslint@8.20.0 + '@antfu/eslint-config-basic': 0.25.2_ficupzxy3q6nk56ibvavehtzue + '@typescript-eslint/eslint-plugin': 5.31.0_ficupzxy3q6nk56ibvavehtzue + '@typescript-eslint/parser': 5.31.0_eslint@8.20.0 eslint: 8.20.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -959,9 +1072,9 @@ packages: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.25.2_b7n364ggt6o4xlkgyoaww3ph3q - '@typescript-eslint/eslint-plugin': 5.30.6_b7n364ggt6o4xlkgyoaww3ph3q - '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa + '@antfu/eslint-config-basic': 0.25.2_d5zwcxr4bwkhmuo464cb3a2puu + '@typescript-eslint/eslint-plugin': 5.31.0_d5zwcxr4bwkhmuo464cb3a2puu + '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa eslint: 8.20.0 typescript: 4.7.4 transitivePeerDependencies: @@ -977,7 +1090,7 @@ packages: dependencies: '@antfu/eslint-config-ts': 0.25.2_4x5o4skxv6sl53vpwefgt23khm eslint: 8.19.0 - eslint-plugin-vue: 9.2.0_eslint@8.19.0 + eslint-plugin-vue: 9.3.0_eslint@8.19.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -992,7 +1105,7 @@ packages: dependencies: '@antfu/eslint-config-ts': 0.25.2_eslint@8.19.0 eslint: 8.19.0 - eslint-plugin-vue: 9.2.0_eslint@8.19.0 + eslint-plugin-vue: 9.3.0_eslint@8.19.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -1007,7 +1120,7 @@ packages: dependencies: '@antfu/eslint-config-ts': 0.25.2_eslint@8.20.0 eslint: 8.20.0 - eslint-plugin-vue: 9.2.0_eslint@8.20.0 + eslint-plugin-vue: 9.3.0_eslint@8.20.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -1022,7 +1135,7 @@ packages: dependencies: '@antfu/eslint-config-ts': 0.25.2_he2ccbldppg44uulnyq4rwocfa eslint: 8.20.0 - eslint-plugin-vue: 9.2.0_eslint@8.20.0 + eslint-plugin-vue: 9.3.0_eslint@8.20.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -1037,17 +1150,17 @@ packages: dependencies: '@antfu/eslint-config-react': 0.25.2_4x5o4skxv6sl53vpwefgt23khm '@antfu/eslint-config-vue': 0.25.2_4x5o4skxv6sl53vpwefgt23khm - '@typescript-eslint/eslint-plugin': 5.30.6_2vt5mtrqleafs33qg2bhpmbaqm - '@typescript-eslint/parser': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/eslint-plugin': 5.31.0_bao7xq2p45jpdplvjvt3gxqp3m + '@typescript-eslint/parser': 5.31.0_4x5o4skxv6sl53vpwefgt23khm eslint: 8.19.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.19.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_rywvbqnelbznwddhxv2glfjuay + eslint-plugin-import: 2.26.0_slugmiwpezfkvxhcmtxfzhclxe eslint-plugin-jsonc: 2.3.1_eslint@8.19.0 eslint-plugin-n: 15.2.4_eslint@8.19.0 eslint-plugin-promise: 6.0.0_eslint@8.19.0 eslint-plugin-unicorn: 42.0.0_eslint@8.19.0 - eslint-plugin-vue: 9.2.0_eslint@8.19.0 + eslint-plugin-vue: 9.3.0_eslint@8.19.0 eslint-plugin-yml: 1.0.0_eslint@8.19.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 @@ -1065,17 +1178,17 @@ packages: dependencies: '@antfu/eslint-config-react': 0.25.2_eslint@8.19.0 '@antfu/eslint-config-vue': 0.25.2_eslint@8.19.0 - '@typescript-eslint/eslint-plugin': 5.30.6_rywvbqnelbznwddhxv2glfjuay - '@typescript-eslint/parser': 5.30.6_eslint@8.19.0 + '@typescript-eslint/eslint-plugin': 5.31.0_slugmiwpezfkvxhcmtxfzhclxe + '@typescript-eslint/parser': 5.31.0_eslint@8.19.0 eslint: 8.19.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.19.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_rywvbqnelbznwddhxv2glfjuay + eslint-plugin-import: 2.26.0_slugmiwpezfkvxhcmtxfzhclxe eslint-plugin-jsonc: 2.3.1_eslint@8.19.0 eslint-plugin-n: 15.2.4_eslint@8.19.0 eslint-plugin-promise: 6.0.0_eslint@8.19.0 eslint-plugin-unicorn: 42.0.0_eslint@8.19.0 - eslint-plugin-vue: 9.2.0_eslint@8.19.0 + eslint-plugin-vue: 9.3.0_eslint@8.19.0 eslint-plugin-yml: 1.0.0_eslint@8.19.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 @@ -1093,17 +1206,17 @@ packages: dependencies: '@antfu/eslint-config-react': 0.25.2_eslint@8.20.0 '@antfu/eslint-config-vue': 0.25.2_eslint@8.20.0 - '@typescript-eslint/eslint-plugin': 5.30.6_y5cwkwncsnk6w3wfynadgn7abe - '@typescript-eslint/parser': 5.30.6_eslint@8.20.0 + '@typescript-eslint/eslint-plugin': 5.31.0_ficupzxy3q6nk56ibvavehtzue + '@typescript-eslint/parser': 5.31.0_eslint@8.20.0 eslint: 8.20.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.20.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_y5cwkwncsnk6w3wfynadgn7abe + eslint-plugin-import: 2.26.0_ficupzxy3q6nk56ibvavehtzue eslint-plugin-jsonc: 2.3.1_eslint@8.20.0 eslint-plugin-n: 15.2.4_eslint@8.20.0 eslint-plugin-promise: 6.0.0_eslint@8.20.0 eslint-plugin-unicorn: 42.0.0_eslint@8.20.0 - eslint-plugin-vue: 9.2.0_eslint@8.20.0 + eslint-plugin-vue: 9.3.0_eslint@8.20.0 eslint-plugin-yml: 1.0.0_eslint@8.20.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 @@ -1121,17 +1234,17 @@ packages: dependencies: '@antfu/eslint-config-react': 0.25.2_he2ccbldppg44uulnyq4rwocfa '@antfu/eslint-config-vue': 0.25.2_he2ccbldppg44uulnyq4rwocfa - '@typescript-eslint/eslint-plugin': 5.30.6_b7n364ggt6o4xlkgyoaww3ph3q - '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/eslint-plugin': 5.31.0_d5zwcxr4bwkhmuo464cb3a2puu + '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa eslint: 8.20.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.20.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_y5cwkwncsnk6w3wfynadgn7abe + eslint-plugin-import: 2.26.0_ficupzxy3q6nk56ibvavehtzue eslint-plugin-jsonc: 2.3.1_eslint@8.20.0 eslint-plugin-n: 15.2.4_eslint@8.20.0 eslint-plugin-promise: 6.0.0_eslint@8.20.0 eslint-plugin-unicorn: 42.0.0_eslint@8.20.0 - eslint-plugin-vue: 9.2.0_eslint@8.20.0 + eslint-plugin-vue: 9.3.0_eslint@8.20.0 eslint-plugin-yml: 1.0.0_eslint@8.20.0 jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 @@ -6400,7 +6513,7 @@ packages: slash: 3.0.0 dev: true - /@rollup/plugin-babel/5.3.1_ayiqorrx7dutx4scyxuyyyvhga: + /@rollup/plugin-babel/5.3.1_3crms4j33zkfeqv7ozcuia3hfq: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -6413,8 +6526,8 @@ packages: dependencies: '@babel/core': 7.18.6 '@babel/helper-module-imports': 7.18.6 - '@rollup/pluginutils': 3.1.0_rollup@2.76.0 - rollup: 2.76.0 + '@rollup/pluginutils': 3.1.0_rollup@2.77.0 + rollup: 2.77.0 dev: true /@rollup/plugin-commonjs/22.0.1_rollup@2.77.0: @@ -6442,19 +6555,19 @@ packages: rollup: 2.77.0 dev: true - /@rollup/plugin-node-resolve/11.2.1_rollup@2.76.0: + /@rollup/plugin-node-resolve/11.2.1_rollup@2.77.0: resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.76.0 + '@rollup/pluginutils': 3.1.0_rollup@2.77.0 '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.2.2 is-module: 1.0.0 resolve: 1.22.1 - rollup: 2.76.0 + rollup: 2.77.0 dev: true /@rollup/plugin-node-resolve/13.3.0_rollup@2.77.0: @@ -6472,14 +6585,14 @@ packages: rollup: 2.77.0 dev: true - /@rollup/plugin-replace/2.4.2_rollup@2.76.0: + /@rollup/plugin-replace/2.4.2_rollup@2.77.0: resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.76.0 + '@rollup/pluginutils': 3.1.0_rollup@2.77.0 magic-string: 0.25.9 - rollup: 2.76.0 + rollup: 2.77.0 dev: true /@rollup/plugin-replace/4.0.0_rollup@2.77.0: @@ -6492,18 +6605,6 @@ packages: rollup: 2.77.0 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.76.0: - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.76.0 - dev: true - /@rollup/pluginutils/3.1.0_rollup@2.77.0: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -7202,8 +7303,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.30.6_2vt5mtrqleafs33qg2bhpmbaqm: - resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} + /@typescript-eslint/eslint-plugin/5.31.0_bao7xq2p45jpdplvjvt3gxqp3m: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -7213,10 +7314,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.30.6_4x5o4skxv6sl53vpwefgt23khm - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6_4x5o4skxv6sl53vpwefgt23khm - '@typescript-eslint/utils': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/parser': 5.31.0_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/utils': 5.31.0_4x5o4skxv6sl53vpwefgt23khm debug: 4.3.4 eslint: 8.19.0 functional-red-black-tree: 1.0.1 @@ -7229,8 +7330,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.30.6_b7n364ggt6o4xlkgyoaww3ph3q: - resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} + /@typescript-eslint/eslint-plugin/5.31.0_d5zwcxr4bwkhmuo464cb3a2puu: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -7240,10 +7341,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa - '@typescript-eslint/utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa debug: 4.3.4 eslint: 8.20.0 functional-red-black-tree: 1.0.1 @@ -7256,34 +7357,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.30.6_rywvbqnelbznwddhxv2glfjuay: - resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.30.6_eslint@8.19.0 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6_eslint@8.19.0 - '@typescript-eslint/utils': 5.30.6_eslint@8.19.0 - debug: 4.3.4 - eslint: 8.19.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin/5.30.6_y5cwkwncsnk6w3wfynadgn7abe: - resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} + /@typescript-eslint/eslint-plugin/5.31.0_ficupzxy3q6nk56ibvavehtzue: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -7293,10 +7368,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.30.6_eslint@8.20.0 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6_eslint@8.20.0 - '@typescript-eslint/utils': 5.30.6_eslint@8.20.0 + '@typescript-eslint/parser': 5.31.0_eslint@8.20.0 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_eslint@8.20.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.20.0 debug: 4.3.4 eslint: 8.20.0 functional-red-black-tree: 1.0.1 @@ -7308,7 +7383,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.31.0_d5zwcxr4bwkhmuo464cb3a2puu: + /@typescript-eslint/eslint-plugin/5.31.0_slugmiwpezfkvxhcmtxfzhclxe: resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7319,24 +7394,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/parser': 5.31.0_eslint@8.19.0 '@typescript-eslint/scope-manager': 5.31.0 - '@typescript-eslint/type-utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa - '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/type-utils': 5.31.0_eslint@8.19.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.19.0 debug: 4.3.4 - eslint: 8.20.0 + eslint: 8.19.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 + tsutils: 3.21.0 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.30.6_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} + /@typescript-eslint/parser/5.31.0_4x5o4skxv6sl53vpwefgt23khm: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -7345,9 +7419,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4 debug: 4.3.4 eslint: 8.19.0 typescript: 4.7.4 @@ -7355,8 +7429,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.30.6_eslint@8.19.0: - resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} + /@typescript-eslint/parser/5.31.0_eslint@8.19.0: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -7365,36 +7439,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0 debug: 4.3.4 eslint: 8.19.0 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.30.6_eslint@8.20.0: - resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6 - debug: 4.3.4 - eslint: 8.20.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser/5.30.6_he2ccbldppg44uulnyq4rwocfa: - resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} + /@typescript-eslint/parser/5.31.0_eslint@8.20.0: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -7403,12 +7458,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0 debug: 4.3.4 eslint: 8.20.0 - typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -7433,14 +7487,6 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.30.6: - resolution: {integrity: sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/visitor-keys': 5.30.6 - dev: true - /@typescript-eslint/scope-manager/5.31.0: resolution: {integrity: sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7449,8 +7495,8 @@ packages: '@typescript-eslint/visitor-keys': 5.31.0 dev: true - /@typescript-eslint/type-utils/5.30.6_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} + /@typescript-eslint/type-utils/5.31.0_4x5o4skxv6sl53vpwefgt23khm: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -7459,7 +7505,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/utils': 5.31.0_4x5o4skxv6sl53vpwefgt23khm debug: 4.3.4 eslint: 8.19.0 tsutils: 3.21.0_typescript@4.7.4 @@ -7468,8 +7514,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils/5.30.6_eslint@8.19.0: - resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} + /@typescript-eslint/type-utils/5.31.0_eslint@8.19.0: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -7478,7 +7524,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.30.6_eslint@8.19.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.19.0 debug: 4.3.4 eslint: 8.19.0 tsutils: 3.21.0 @@ -7486,8 +7532,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils/5.30.6_eslint@8.20.0: - resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} + /@typescript-eslint/type-utils/5.31.0_eslint@8.20.0: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -7496,7 +7542,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.30.6_eslint@8.20.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.20.0 debug: 4.3.4 eslint: 8.20.0 tsutils: 3.21.0 @@ -7504,25 +7550,6 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils/5.30.6_he2ccbldppg44uulnyq4rwocfa: - resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa - debug: 4.3.4 - eslint: 8.20.0 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils/5.31.0_he2ccbldppg44uulnyq4rwocfa: resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7542,18 +7569,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.30.6: - resolution: {integrity: sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types/5.31.0: resolution: {integrity: sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.30.6: - resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} + /@typescript-eslint/typescript-estree/5.31.0: + resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -7561,8 +7583,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/visitor-keys': 5.30.6 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -7572,27 +7594,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.30.6_typescript@4.7.4: - resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/visitor-keys': 5.30.6 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree/5.31.0_typescript@4.7.4: resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7614,16 +7615,16 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.30.6_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} + /@typescript-eslint/utils/5.31.0_4x5o4skxv6sl53vpwefgt23khm: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4 eslint: 8.19.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.19.0 @@ -7632,16 +7633,16 @@ packages: - typescript dev: true - /@typescript-eslint/utils/5.30.6_eslint@8.19.0: - resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} + /@typescript-eslint/utils/5.31.0_eslint@8.19.0: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0 eslint: 8.19.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.19.0 @@ -7650,34 +7651,16 @@ packages: - typescript dev: true - /@typescript-eslint/utils/5.30.6_eslint@8.20.0: - resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6 - eslint: 8.20.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.20.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils/5.30.6_he2ccbldppg44uulnyq4rwocfa: - resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} + /@typescript-eslint/utils/5.31.0_eslint@8.20.0: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0 eslint: 8.20.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.20.0 @@ -7704,14 +7687,6 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.30.6: - resolution: {integrity: sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.30.6 - eslint-visitor-keys: 3.3.0 - dev: true - /@typescript-eslint/visitor-keys/5.31.0: resolution: {integrity: sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10227,14 +10202,6 @@ packages: /dataloader/2.1.0: resolution: {integrity: sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==} - /date-fns-tz/1.3.6_date-fns@2.28.0: - resolution: {integrity: sha512-C8q7mErvG4INw1ZwAFmPlGjEo5Sv4udjKVbTc03zpP9cu6cp5AemFzKhz0V68LGcWEtX5mJudzzg3G04emIxLA==} - peerDependencies: - date-fns: '>=2.0.0' - dependencies: - date-fns: 2.28.0 - dev: true - /date-fns-tz/1.3.6_date-fns@2.29.1: resolution: {integrity: sha512-C8q7mErvG4INw1ZwAFmPlGjEo5Sv4udjKVbTc03zpP9cu6cp5AemFzKhz0V68LGcWEtX5mJudzzg3G04emIxLA==} peerDependencies: @@ -10246,11 +10213,6 @@ packages: /date-fns/1.30.1: resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} - /date-fns/2.28.0: - resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==} - engines: {node: '>=0.11'} - dev: true - /date-fns/2.29.1: resolution: {integrity: sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==} engines: {node: '>=0.11'} @@ -11199,32 +11161,6 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.3_bsugbhruclroeiaqnd7gqoy7ya: - resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa - debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 - find-up: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils/2.7.3_vozeh3qpn3prlhg65r4uuu3jv4: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} @@ -11254,7 +11190,7 @@ packages: /eslint-plugin-antfu/0.25.2_4x5o4skxv6sl53vpwefgt23khm: resolution: {integrity: sha512-yRhuFMwUKhSYm8BWTZsW4ymYnFPCJWZb2LzjG+mQb7JbKflk73JIFMCREPOaV4nWwc4YJEPhym75QsC7AFbqSw==} dependencies: - '@typescript-eslint/utils': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/utils': 5.31.0_4x5o4skxv6sl53vpwefgt23khm transitivePeerDependencies: - eslint - supports-color @@ -11264,7 +11200,7 @@ packages: /eslint-plugin-antfu/0.25.2_eslint@8.19.0: resolution: {integrity: sha512-yRhuFMwUKhSYm8BWTZsW4ymYnFPCJWZb2LzjG+mQb7JbKflk73JIFMCREPOaV4nWwc4YJEPhym75QsC7AFbqSw==} dependencies: - '@typescript-eslint/utils': 5.30.6_eslint@8.19.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.19.0 transitivePeerDependencies: - eslint - supports-color @@ -11274,7 +11210,7 @@ packages: /eslint-plugin-antfu/0.25.2_eslint@8.20.0: resolution: {integrity: sha512-yRhuFMwUKhSYm8BWTZsW4ymYnFPCJWZb2LzjG+mQb7JbKflk73JIFMCREPOaV4nWwc4YJEPhym75QsC7AFbqSw==} dependencies: - '@typescript-eslint/utils': 5.30.6_eslint@8.20.0 + '@typescript-eslint/utils': 5.31.0_eslint@8.20.0 transitivePeerDependencies: - eslint - supports-color @@ -11284,7 +11220,7 @@ packages: /eslint-plugin-antfu/0.25.2_he2ccbldppg44uulnyq4rwocfa: resolution: {integrity: sha512-yRhuFMwUKhSYm8BWTZsW4ymYnFPCJWZb2LzjG+mQb7JbKflk73JIFMCREPOaV4nWwc4YJEPhym75QsC7AFbqSw==} dependencies: - '@typescript-eslint/utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa transitivePeerDependencies: - eslint - supports-color @@ -11372,7 +11308,7 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.26.0_rywvbqnelbznwddhxv2glfjuay: + /eslint-plugin-import/2.26.0_slugmiwpezfkvxhcmtxfzhclxe: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -11382,45 +11318,14 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.30.6_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/parser': 5.31.0_4x5o4skxv6sl53vpwefgt23khm array-includes: 3.1.5 array.prototype.flat: 1.3.0 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.19.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_bsugbhruclroeiaqnd7gqoy7ya - has: 1.0.3 - is-core-module: 2.9.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.5 - resolve: 1.22.1 - tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-import/2.26.0_y5cwkwncsnk6w3wfynadgn7abe: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa - array-includes: 3.1.5 - array.prototype.flat: 1.3.0 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 8.20.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_bsugbhruclroeiaqnd7gqoy7ya + eslint-module-utils: 2.7.3_vozeh3qpn3prlhg65r4uuu3jv4 has: 1.0.3 is-core-module: 2.9.0 is-glob: 4.0.3 @@ -11643,8 +11548,8 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-vue/9.2.0_eslint@8.19.0: - resolution: {integrity: sha512-W2hc+NUXoce8sZtWgZ45miQTy6jNyuSdub5aZ1IBune4JDeAyzucYX0TzkrQ1jMO52sNUDYlCIHDoaNePe0p5g==} + /eslint-plugin-vue/9.3.0_eslint@8.19.0: + resolution: {integrity: sha512-iscKKkBZgm6fGZwFt6poRoWC0Wy2dQOlwUPW++CiPoQiw1enctV2Hj5DBzzjJZfyqs+FAXhgzL4q0Ww03AgSmQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 @@ -11661,24 +11566,6 @@ packages: - supports-color dev: true - /eslint-plugin-vue/9.2.0_eslint@8.20.0: - resolution: {integrity: sha512-W2hc+NUXoce8sZtWgZ45miQTy6jNyuSdub5aZ1IBune4JDeAyzucYX0TzkrQ1jMO52sNUDYlCIHDoaNePe0p5g==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - dependencies: - eslint: 8.20.0 - eslint-utils: 3.0.0_eslint@8.20.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.0.10 - semver: 7.3.7 - vue-eslint-parser: 9.0.3_eslint@8.20.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-plugin-vue/9.3.0_eslint@8.20.0: resolution: {integrity: sha512-iscKKkBZgm6fGZwFt6poRoWC0Wy2dQOlwUPW++CiPoQiw1enctV2Hj5DBzzjJZfyqs+FAXhgzL4q0Ww03AgSmQ==} engines: {node: ^14.17.0 || >=16.0.0} @@ -16364,8 +16251,8 @@ packages: '@types/lodash-es': 4.17.6 async-validator: 4.2.5 css-render: 0.15.10 - date-fns: 2.28.0 - date-fns-tz: 1.3.6_date-fns@2.28.0 + date-fns: 2.29.1 + date-fns-tz: 1.3.6_date-fns@2.29.1 evtd: 0.2.3 highlight.js: 11.6.0 lodash: 4.17.21 @@ -18672,26 +18559,18 @@ packages: - supports-color dev: true - /rollup-plugin-terser/7.0.2_rollup@2.76.0: + /rollup-plugin-terser/7.0.2_rollup@2.77.0: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} peerDependencies: rollup: ^2.0.0 dependencies: '@babel/code-frame': 7.18.6 jest-worker: 26.6.2 - rollup: 2.76.0 + rollup: 2.77.0 serialize-javascript: 4.0.0 terser: 5.14.1 dev: true - /rollup/2.76.0: - resolution: {integrity: sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rollup/2.77.0: resolution: {integrity: sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==} engines: {node: '>=10.0.0'} @@ -21161,7 +21040,7 @@ packages: debug: 4.3.4 fast-glob: 3.2.11 pretty-bytes: 6.0.0 - rollup: 2.76.0 + rollup: 2.77.0 vite: 3.0.3 workbox-build: 6.5.3 workbox-window: 6.5.3 @@ -21619,9 +21498,9 @@ packages: '@babel/core': 7.18.6 '@babel/preset-env': 7.18.6_@babel+core@7.18.6 '@babel/runtime': 7.18.6 - '@rollup/plugin-babel': 5.3.1_ayiqorrx7dutx4scyxuyyyvhga - '@rollup/plugin-node-resolve': 11.2.1_rollup@2.76.0 - '@rollup/plugin-replace': 2.4.2_rollup@2.76.0 + '@rollup/plugin-babel': 5.3.1_3crms4j33zkfeqv7ozcuia3hfq + '@rollup/plugin-node-resolve': 11.2.1_rollup@2.77.0 + '@rollup/plugin-replace': 2.4.2_rollup@2.77.0 '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.11.0 common-tags: 1.8.2 @@ -21630,8 +21509,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: 2.76.0 - rollup-plugin-terser: 7.0.2_rollup@2.76.0 + rollup: 2.77.0 + rollup-plugin-terser: 7.0.2_rollup@2.77.0 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 49987984..c7eaed9c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,3 @@ packages: - - "packages/*" - - "apps/*" \ No newline at end of file + - apps/* + - packages/* \ No newline at end of file From 002b747a5006b844e289c91bcaaca7319678cf91 Mon Sep 17 00:00:00 2001 From: productdevbook Date: Sat, 6 Aug 2022 19:04:15 +0300 Subject: [PATCH 2/4] Update main.ts --- apps/vue-admin/src/main.ts | 77 +++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/apps/vue-admin/src/main.ts b/apps/vue-admin/src/main.ts index a529fa12..c5e01e0e 100644 --- a/apps/vue-admin/src/main.ts +++ b/apps/vue-admin/src/main.ts @@ -4,12 +4,10 @@ import axios from 'axios' import 'uno.css' import './assets/base.css' import { createHead } from '@vueuse/head' -import { onMessage } from 'firebase/messaging' -import router, { routes } from './router' -import { messaging } from './services/notifications' -import App from './App.vue' // import { onMessage } from 'firebase/messaging' +import router, { routes } from './router' // import { messaging } from './services/notifications' +import App from './App.vue' const meta = document.createElement('meta') meta.name = 'naive-ui-style' @@ -43,41 +41,44 @@ if (import.meta.hot) import.meta.hot.accept() init() -onMessage(messaging, (payload) => { - if (payload.notification === undefined) - return +// TODO nullable Firebase messaging +// if (import.meta.env.VITE_FIREBASE_CONFIG) { +// onMessage(messaging, (payload) => { +// if (payload.notification === undefined) +// return - // console.log(payload.data) - const notificationData = payload +// // console.log(payload.data) +// const notificationData = payload - // eslint-disable-next-line no-console - console.log( - '[firebase-messaging-sw.js] Received foreground message ', - notificationData, - ) - const { tSuccess } = usePWebNotification() - if (notificationData.data) - tSuccess({ title: notificationData.data.title, description: notificationData.data.body }) +// // eslint-disable-next-line no-console +// console.log( +// '[firebase-messaging-sw.js] Received foreground message ', +// notificationData, +// ) +// const { tSuccess } = usePWebNotification() +// if (notificationData.data) +// tSuccess({ title: notificationData.data.title, description: notificationData.data.body }) - const { title, body } = notificationData.data as { title: string; body: string } - const notificationTitle = title - const notificationOptions = { - body, - icon: '/logo-dark.png', - } +// const { title, body } = notificationData.data as { title: string; body: string } +// const notificationTitle = title +// const notificationOptions = { +// body, +// icon: '/logo-dark.png', +// } - navigator.serviceWorker.ready.then((registration) => { - registration - .showNotification(notificationTitle, notificationOptions) - .then(() => { - // eslint-disable-next-line no-console - console.log('[firebase-messaging-sw.js] Notification shown') - }) - .catch((error) => { - console.error( - '[firebase-messaging-sw.js] Error showing notification', - error, - ) - }) - }) -}) +// navigator.serviceWorker.ready.then((registration) => { +// registration +// .showNotification(notificationTitle, notificationOptions) +// .then(() => { +// // eslint-disable-next-line no-console +// console.log('[firebase-messaging-sw.js] Notification shown') +// }) +// .catch((error) => { +// console.error( +// '[firebase-messaging-sw.js] Error showing notification', +// error, +// ) +// }) +// }) +// }) +// } From 18d74ee90977b9b4017667d68213e9a6dede7979 Mon Sep 17 00:00:00 2001 From: productdevbook Date: Sat, 6 Aug 2022 20:24:57 +0300 Subject: [PATCH 3/4] feat: admin panel --- apps/nestjs/src/main.ts | 18 ++++++++--- apps/vue-admin/.env.example | 3 ++ apps/vue-admin/src/components.d.ts | 1 + apps/vue-admin/src/layouts/default.vue | 5 ++- apps/vue-admin/src/modules/apollo-graphql.ts | 31 ++++++++++++++----- apps/vue-admin/src/pages/auth/login.vue | 4 +-- .../src/pages/{ => auth}/onlogin.vue | 7 ++--- packages/oku-api/graphql/query/auth.graphql | 1 + packages/oku-api/node-graphql.ts | 4 +-- packages/oku-api/types/vue-apollo.ts | 3 +- .../vue-design-system/components/Logo.vue | 22 +++++++++++++ 11 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 apps/vue-admin/.env.example rename apps/vue-admin/src/pages/{ => auth}/onlogin.vue (59%) create mode 100644 packages/vue-design-system/components/Logo.vue diff --git a/apps/nestjs/src/main.ts b/apps/nestjs/src/main.ts index 468cf423..230a27e2 100644 --- a/apps/nestjs/src/main.ts +++ b/apps/nestjs/src/main.ts @@ -35,11 +35,19 @@ async function bootstrap() { const urls = config.get('CORS_ORIGIN')!.split(',') urls.push(ip) - app.enableCors({ - origin: [...urls, new RegExp(`/^http:\/\/192\.168\.1\.([1-9]|[1-9]\d):${5000}$/`), /^https?:\/\/192\.168\.0\.[0-9]{1,3}/], - credentials: true, - optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204 - }) + if (process.env.NODE_ENV === 'development') { + app.enableCors({ + origin: [...urls, '*'], + credentials: true, + }) + } + else { + app.enableCors({ + origin: [...urls], + credentials: true, + optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204 + }) + } const configService = app.get(ConfigService) const port = configService.get('PORT') diff --git a/apps/vue-admin/.env.example b/apps/vue-admin/.env.example new file mode 100644 index 00000000..529154f6 --- /dev/null +++ b/apps/vue-admin/.env.example @@ -0,0 +1,3 @@ +VITE_FIREBASE_CONFIG= +VITE_VAPID_KEY= +VITE_SERVER_URL=localhost \ No newline at end of file diff --git a/apps/vue-admin/src/components.d.ts b/apps/vue-admin/src/components.d.ts index abe62973..585850ba 100644 --- a/apps/vue-admin/src/components.d.ts +++ b/apps/vue-admin/src/components.d.ts @@ -17,6 +17,7 @@ declare module '@vue/runtime-core' { FormInputWithValidation: typeof import('./../../../packages/vue-design-system/components/form/input-with-validation.vue')['default'] FormSection: typeof import('./../../../packages/vue-design-system/components/form/section.vue')['default'] HelloWorld: typeof import('./components/HelloWorld.vue')['default'] + Logo: typeof import('./../../../packages/vue-design-system/components/Logo.vue')['default'] MainPanel: typeof import('./components/MainPanel.vue')['default'] NButton: typeof import('naive-ui')['NButton'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] diff --git a/apps/vue-admin/src/layouts/default.vue b/apps/vue-admin/src/layouts/default.vue index 94ca203e..8ff76528 100644 --- a/apps/vue-admin/src/layouts/default.vue +++ b/apps/vue-admin/src/layouts/default.vue @@ -31,9 +31,8 @@ onMounted(() => {