From 6c63a8dc283e71a5bd8d822ae4abe66699e8979a Mon Sep 17 00:00:00 2001 From: Joel Jacob Stephen <70131076+JoelJacobStephen@users.noreply.github.com> Date: Fri, 6 Oct 2023 17:36:19 +0530 Subject: [PATCH] refactor: updated i18n implementation in the admin dashboard (#3395) * feat: introduced new unplugin i18n and removed the old vite i18n package * refactor: updated vite config to support the new plugin * refactor: removed irrelevant logic from the i18n module --- packages/hoppscotch-sh-admin/package.json | 2 +- .../hoppscotch-sh-admin/src/modules/i18n.ts | 148 +-------------- packages/hoppscotch-sh-admin/vite.config.ts | 37 ++-- pnpm-lock.yaml | 178 ++++++++++++------ 4 files changed, 145 insertions(+), 220 deletions(-) diff --git a/packages/hoppscotch-sh-admin/package.json b/packages/hoppscotch-sh-admin/package.json index 903b4c4fa..05b83edbd 100644 --- a/packages/hoppscotch-sh-admin/package.json +++ b/packages/hoppscotch-sh-admin/package.json @@ -19,6 +19,7 @@ "@graphql-typed-document-node/core": "^3.1.1", "@hoppscotch/ui": "workspace:^", "@hoppscotch/vue-toasted": "^0.1.0", + "@intlify/unplugin-vue-i18n": "^1.2.0", "@types/cors": "^2.8.13", "@types/express": "^4.17.15", "@urql/vue": "^1.0.4", @@ -53,7 +54,6 @@ "@graphql-codegen/urql-introspection": "2.2.1", "@import-meta-env/cli": "^0.6.3", "@import-meta-env/unplugin": "^0.4.8", - "@intlify/vite-plugin-vue-i18n": "^7.0.0", "@vitejs/plugin-vue": "^3.1.0", "@vue/compiler-sfc": "^3.2.6", "dotenv": "^16.0.3", diff --git a/packages/hoppscotch-sh-admin/src/modules/i18n.ts b/packages/hoppscotch-sh-admin/src/modules/i18n.ts index 490676ecc..ac123b501 100644 --- a/packages/hoppscotch-sh-admin/src/modules/i18n.ts +++ b/packages/hoppscotch-sh-admin/src/modules/i18n.ts @@ -1,154 +1,16 @@ -import * as R from 'fp-ts/Record'; -import * as A from 'fp-ts/Array'; -import * as O from 'fp-ts/Option'; -import { pipe } from 'fp-ts/function'; -import { createI18n, I18n, I18nOptions } from 'vue-i18n'; +import { createI18n } from 'vue-i18n'; import { HoppModule } from '.'; - -import languages from '../../languages.json'; - -import { throwError } from '../helpers/error'; -import { getLocalConfig, setLocalConfig } from '../helpers/localpersistence'; - -/* - In context of this file, we have 2 main kinds of things. - 1. Locale -> A locale is termed as the i18n entries present in the /locales folder - 2. Language -> A language is an entry in the /languages.json folder - - Each language entry should correspond to a locale entry. -*/ - -/* - * As we migrate out of Nuxt I18n into our own system for i18n management, - * Some stuff has changed regarding how it works. - * - * The previous system works by using paths to represent locales to load. - * Basically, /es/realtime will load the /realtime page but with 'es' language - * - * In the new system instead of relying on the lang code, we store the language - * in the application local config store (localStorage). The URLs don't have - * a locale path effect - */ - -// TODO: Syncing into settings ? - -const LOCALES = import.meta.glob('../../locales/*.json'); - -setTimeout(() => { - console.log(LOCALES); -}, 1000); - -type LanguagesDef = { - code: string; - file: string; - iso: string; - name: string; - dir?: 'ltr' | 'rtl'; // Text Orientation (defaults to 'ltr') -}; - -const FALLBACK_LANG_CODE = 'en'; - -// TypeScript cannot understand dir is restricted to "ltr" or "rtl" yet, hence assertion -export const APP_LANGUAGES: LanguagesDef[] = languages as LanguagesDef[]; - -export const APP_LANG_CODES = languages.map(({ code }) => code); - -export const FALLBACK_LANG = pipe( - APP_LANGUAGES, - A.findFirst((x) => x.code === FALLBACK_LANG_CODE), - O.getOrElseW(() => - throwError(`Could not find the fallback language '${FALLBACK_LANG_CODE}'`) - ) -); - -// A reference to the i18n instance -let i18nInstance: I18n | null = null; - -const resolveCurrentLocale = () => - pipe( - // Resolve from locale and make sure it is in languages - getLocalConfig('locale'), - O.fromNullable, - O.filter((locale) => - pipe( - APP_LANGUAGES, - A.some(({ code }) => code === locale) - ) - ), - - // Else load from navigator.language - O.alt(() => - pipe( - APP_LANGUAGES, - A.findFirst(({ code }) => navigator.language.startsWith(code)), // en-US should also match to en - O.map(({ code }) => code) - ) - ), - - // Else load fallback - O.getOrElse(() => FALLBACK_LANG_CODE) - ); - -/** - * Changes the application language. This function returns a promise as - * the locale files are lazy loaded on demand - * @param locale The locale code of the language to load - */ -export const changeAppLanguage = async (locale: string) => { - const localeData = ( - (await pipe( - LOCALES, - R.lookup(`../../locales/${locale}.json`), - O.getOrElseW(() => - throwError( - `Tried to change app language to non-existent locale '${locale}'` - ) - ) - )()) as any - ).default; - - if (!i18nInstance) { - throw new Error('Tried to change language without active i18n instance'); - } - - i18nInstance.global.setLocaleMessage(locale, localeData); - - // TODO: Look into the type issues here - i18nInstance.global.locale.value = locale; - - setLocalConfig('locale', locale); -}; +import messages from '@intlify/unplugin-vue-i18n/messages'; export default { onVueAppInit(app) { - const i18n = createI18n({ - locale: 'en', // TODO: i18n system! + const i18n = createI18n({ + locale: 'en', + messages, fallbackLocale: 'en', legacy: false, allowComposition: true, }); - app.use(i18n); - - i18nInstance = i18n; - - // TODO: Global loading state to hide the resolved lang loading - const currentLocale = resolveCurrentLocale(); - changeAppLanguage(currentLocale); - - setLocalConfig('locale', currentLocale); - }, - onBeforeRouteChange(to, _, router) { - // Convert old locale path format to new format - const oldLocalePathLangCode = APP_LANG_CODES.find((langCode) => - to.path.startsWith(`/${langCode}/`) - ); - - // Change language to the correct lang code - if (oldLocalePathLangCode) { - changeAppLanguage(oldLocalePathLangCode); - - router.replace(to.path.substring(`/${oldLocalePathLangCode}`.length)); - } }, }; diff --git a/packages/hoppscotch-sh-admin/vite.config.ts b/packages/hoppscotch-sh-admin/vite.config.ts index 1fdc8cc82..3e6328fd0 100644 --- a/packages/hoppscotch-sh-admin/vite.config.ts +++ b/packages/hoppscotch-sh-admin/vite.config.ts @@ -2,23 +2,20 @@ import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import { FileSystemIconLoader } from 'unplugin-icons/loaders'; import Icons from 'unplugin-icons/vite'; -import Unfonts from "unplugin-fonts/vite"; +import Unfonts from 'unplugin-fonts/vite'; import IconResolver from 'unplugin-icons/resolver'; import Components from 'unplugin-vue-components/vite'; import WindiCSS from 'vite-plugin-windicss'; import Pages from 'vite-plugin-pages'; import Layouts from 'vite-plugin-vue-layouts'; -import VueI18n from '@intlify/vite-plugin-vue-i18n'; import path from 'path'; -import ImportMetaEnv from "@import-meta-env/unplugin" +import ImportMetaEnv from '@import-meta-env/unplugin'; +import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'; // https://vitejs.dev/config/ export default defineConfig({ - envPrefix: - process.env.HOPP_ALLOW_RUNTIME_ENV - ? "VITE_BUILDTIME_" - : "VITE_", - envDir: path.resolve(__dirname, "../.."), + envPrefix: process.env.HOPP_ALLOW_RUNTIME_ENV ? 'VITE_BUILDTIME_' : 'VITE_', + envDir: path.resolve(__dirname, '../..'), server: { port: 3100, }, @@ -38,10 +35,10 @@ export default defineConfig({ defaultLayout: 'default', layoutsDirs: 'src/layouts', }), - VueI18n({ + VueI18nPlugin({ runtimeOnly: false, compositionOnly: true, - include: [path.resolve(__dirname, 'locales')], + include: [path.resolve(__dirname, './locales/**')], }), WindiCSS({ root: path.resolve(__dirname), @@ -78,24 +75,24 @@ export default defineConfig({ fontsource: { families: [ { - name: "Inter Variable", - variables: ["variable-full"], + name: 'Inter Variable', + variables: ['variable-full'], }, { - name: "Material Symbols Rounded Variable", - variables: ["variable-full"], + name: 'Material Symbols Rounded Variable', + variables: ['variable-full'], }, { - name: "Roboto Mono Variable", - variables: ["variable-full"], + name: 'Roboto Mono Variable', + variables: ['variable-full'], }, ], - } + }, }), process.env.HOPP_ALLOW_RUNTIME_ENV - ? ImportMetaEnv.vite({ - example: "../../.env.example", - env: "../../.env", + ? ImportMetaEnv.vite({ + example: '../../.env.example', + env: '../../.env', }) : [], ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45dabcbf5..3a46d7668 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -933,7 +933,7 @@ importers: version: 3.2.0(graphql@16.8.0) '@intlify/vite-plugin-vue-i18n': specifier: ^7.0.0 - version: 7.0.0(vite@3.2.4)(vue-i18n@9.2.2) + version: 7.0.0(vite@4.4.9)(vue-i18n@9.2.2) '@rushstack/eslint-patch': specifier: ^1.3.3 version: 1.3.3 @@ -1039,6 +1039,9 @@ importers: '@hoppscotch/vue-toasted': specifier: ^0.1.0 version: 0.1.0(vue@3.2.45) + '@intlify/unplugin-vue-i18n': + specifier: ^1.2.0 + version: 1.2.0(vue-i18n@9.2.2) '@types/cors': specifier: ^2.8.13 version: 2.8.13 @@ -1136,9 +1139,6 @@ importers: '@import-meta-env/unplugin': specifier: ^0.4.8 version: 0.4.8(@import-meta-env/cli@0.6.3)(dotenv@16.3.1) - '@intlify/vite-plugin-vue-i18n': - specifier: ^7.0.0 - version: 7.0.0(vite@3.2.4)(vue-i18n@9.2.2) '@vitejs/plugin-vue': specifier: ^3.1.0 version: 3.2.0(vite@3.2.4)(vue@3.2.45) @@ -1731,15 +1731,14 @@ packages: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.18.6 /@babel/code-frame@7.22.10: resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.22.10 chalk: 2.4.2 - dev: true /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} @@ -1963,6 +1962,10 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -1993,6 +1996,22 @@ packages: transitivePeerDependencies: - supports-color + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} @@ -2524,7 +2543,7 @@ packages: '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.22.5 /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} @@ -2911,7 +2930,7 @@ packages: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.22.10 '@babel/parser': 7.22.10 '@babel/types': 7.20.7 dev: true @@ -2920,7 +2939,7 @@ packages: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.22.10 '@babel/parser': 7.22.10 '@babel/types': 7.22.10 @@ -2946,7 +2965,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 dev: true @@ -6058,6 +6077,31 @@ packages: yaml-eslint-parser: 0.3.2 dev: true + /@intlify/bundle-utils@7.3.0(vue-i18n@9.2.2): + resolution: {integrity: sha512-lcnfsLA5Dyd3TbvfoLS0ejLr1vAJYyT6VRYtE4LGNexy1ZD/GEcbXrC33fI9oQp7t2hDlHbCn2o4BBVgXaJFqg==} + engines: {node: '>= 14.16'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + dependencies: + '@intlify/message-compiler': 9.4.1 + '@intlify/shared': 9.4.1 + acorn: 8.10.0 + escodegen: 2.1.0 + estree-walker: 2.0.2 + jsonc-eslint-parser: 2.3.0 + magic-string: 0.30.2 + mlly: 1.4.0 + source-map-js: 1.0.2 + vue-i18n: 9.2.2(vue@3.2.45) + yaml-eslint-parser: 1.2.2 + dev: false + /@intlify/core-base@9.2.2: resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} engines: {node: '>= 14'} @@ -6094,7 +6138,6 @@ packages: dependencies: '@intlify/shared': 9.4.1 source-map-js: 1.0.2 - dev: true /@intlify/shared@9.2.2: resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} @@ -6108,7 +6151,39 @@ packages: /@intlify/shared@9.4.1: resolution: {integrity: sha512-A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==} engines: {node: '>= 16'} - dev: true + + /@intlify/unplugin-vue-i18n@1.2.0(vue-i18n@9.2.2): + resolution: {integrity: sha512-AzjlMZKj9DG10ICDR2VWjfJudHJ1XK2GNSHxw+VmOUYpUm4S0L/a7OAdvgnuY7S4plk1VnPdT4YilpZk+uQcqg==} + engines: {node: '>= 14.16'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + vue-i18n-bridge: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + vue-i18n-bridge: + optional: true + dependencies: + '@intlify/bundle-utils': 7.3.0(vue-i18n@9.2.2) + '@intlify/shared': 9.4.1 + '@rollup/pluginutils': 5.0.3(rollup@2.79.1) + '@vue/compiler-sfc': 3.3.4 + debug: 4.3.4(supports-color@9.2.2) + fast-glob: 3.3.1 + js-yaml: 4.1.0 + json5: 2.2.3 + pathe: 1.1.1 + picocolors: 1.0.0 + source-map-js: 1.0.2 + unplugin: 1.4.0 + vue-i18n: 9.2.2(vue@3.2.45) + transitivePeerDependencies: + - rollup + - supports-color + dev: false /@intlify/vite-plugin-vue-i18n@6.0.1(vite@3.2.4): resolution: {integrity: sha512-FFVcxVU4bR9vdDLNbltM5mrhndnXMErO01i0RrpdyMegEt3Nu/YLoH0sFdjRun7/RY4vaEnhTnFvVf9uO0dQvg==} @@ -6136,34 +6211,6 @@ packages: - supports-color dev: true - /@intlify/vite-plugin-vue-i18n@7.0.0(vite@3.2.4)(vue-i18n@9.2.2): - resolution: {integrity: sha512-2TbDOQ8XD+vkc0s5OFmr+IY/k4mYMC7pzvx0xGQn+cU/ev314+yi7Z7N7rWcBgiYk1WOUalbGSo3d4nJDxOOyw==} - engines: {node: '>= 14.6'} - deprecated: This plugin support until Vite 3. If you would like to use on Vite 4, please use @intlify/unplugin-vue-i18n - peerDependencies: - petite-vue-i18n: '*' - vite: ^2.9.0 || ^3.0.0 - vue-i18n: '*' - peerDependenciesMeta: - petite-vue-i18n: - optional: true - vite: - optional: true - vue-i18n: - optional: true - dependencies: - '@intlify/bundle-utils': 3.4.0(vue-i18n@9.2.2) - '@intlify/shared': 9.4.1 - '@rollup/pluginutils': 4.2.1 - debug: 4.3.4(supports-color@9.2.2) - fast-glob: 3.3.1 - source-map: 0.6.1 - vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.19.2) - vue-i18n: 9.2.2(vue@3.2.45) - transitivePeerDependencies: - - supports-color - dev: true - /@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.4.9)(vue-i18n@9.2.2): resolution: {integrity: sha512-2TbDOQ8XD+vkc0s5OFmr+IY/k4mYMC7pzvx0xGQn+cU/ev314+yi7Z7N7rWcBgiYk1WOUalbGSo3d4nJDxOOyw==} engines: {node: '>= 14.6'} @@ -7531,7 +7578,6 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.79.1 - dev: true /@rollup/pluginutils@5.0.3(rollup@3.29.3): resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==} @@ -7978,7 +8024,7 @@ packages: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.4.10 - '@types/estree': 0.0.51 + '@types/estree': 1.0.1 dev: true /@types/eslint@8.4.10: @@ -7996,7 +8042,6 @@ packages: /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true /@types/express-serve-static-core@4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} @@ -9218,7 +9263,7 @@ packages: /@vitest/snapshot@0.34.2: resolution: {integrity: sha512-qhQ+xy3u4mwwLxltS4Pd4SR+XHv4EajiTPNY3jkIBLUApE6/ce72neJPSUQZ7bL3EBuKI+NhvzhGj3n5baRQUQ==} dependencies: - magic-string: 0.30.4 + magic-string: 0.30.2 pathe: 1.1.1 pretty-format: 29.5.0 dev: true @@ -9526,7 +9571,7 @@ packages: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.4 + magic-string: 0.30.2 /@vue/reactivity@3.2.45: resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} @@ -10063,7 +10108,7 @@ packages: '@windicss/config': 1.9.1 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 - magic-string: 0.30.4 + magic-string: 0.30.2 micromatch: 4.0.5 windicss: 3.5.6 transitivePeerDependencies: @@ -12545,7 +12590,7 @@ packages: is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.12.2 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.0 @@ -13151,7 +13196,6 @@ packages: esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true /eslint-config-prettier@8.5.0(eslint@8.29.0): resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} @@ -17105,6 +17149,16 @@ packages: semver: 6.3.1 dev: true + /jsonc-eslint-parser@2.3.0: + resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.5.4 + dev: false + /jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} dev: true @@ -17115,7 +17169,6 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -17575,6 +17628,7 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /mailparser@3.6.4: resolution: {integrity: sha512-4bDgbLdlcBKX8jtVskfn/G93nZo3lf7pyuLbAQ031SHQLihEqxtRwHrb9SXMTqiTkEGlOdpDrZE5uH18O+2A+A==} @@ -18288,7 +18342,6 @@ packages: pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.2.0 - dev: true /mocha@9.2.2: resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} @@ -18580,6 +18633,10 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + /object-inspect@1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -19080,7 +19137,6 @@ packages: /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -19151,7 +19207,6 @@ packages: jsonc-parser: 3.2.0 mlly: 1.4.0 pathe: 1.1.1 - dev: true /pkginfo@0.4.1: resolution: {integrity: sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==} @@ -21942,7 +21997,6 @@ packages: /ufo@1.2.0: resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} - dev: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -22327,7 +22381,6 @@ packages: chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 - dev: true /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -23580,6 +23633,7 @@ packages: '@intlify/vue-devtools': 9.2.2 '@vue/devtools-api': 6.2.1 vue: 3.2.45 + dev: false /vue-i18n@9.2.2(vue@3.3.4): resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} @@ -24613,6 +24667,15 @@ packages: yaml: 1.10.2 dev: true + /yaml-eslint-parser@1.2.2: + resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.4.3 + lodash: 4.17.21 + yaml: 2.3.1 + dev: false + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -24620,7 +24683,6 @@ packages: /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - dev: true /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -24762,3 +24824,7 @@ packages: /zod@3.22.2: resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false