├── src ├── global.d.ts ├── useApi.ts ├── globalExtensions.ts ├── injectionSymbols.ts ├── types.ts ├── index.ts └── utils │ └── index.ts ├── .gitignore ├── .prettierrc ├── playground ├── tsconfig.json ├── shim.d.ts ├── vite.config.js ├── package.json ├── index.html ├── src │ ├── main.ts │ └── App.vue └── yarn.lock ├── jest.config.js ├── CHANGELOG.md ├── tsconfig.json ├── scripts ├── verifyCommit.js └── release.js ├── LICENSE ├── api-extractor.json ├── __tests__ ├── utils.spec.ts └── i18n.spec.ts ├── README.md ├── package.json └── rollup.config.js /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare var __DEV__: boolean 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | temp 4 | .idea 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "trailingComma": "es5", 4 | "singleQuote": true, 5 | "arrowParens": "avoid" 6 | } 7 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "*.ts", 4 | "../src/global.d.ts", 5 | "shim.d.ts" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /playground/shim.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import { Component } from 'vue' 3 | var component: Component 4 | export default component 5 | } 6 | -------------------------------------------------------------------------------- /playground/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | }) 8 | -------------------------------------------------------------------------------- /src/useApi.ts: -------------------------------------------------------------------------------- 1 | import { inject } from 'vue' 2 | import { vueI18nKey } from './injectionSymbols' 3 | import { I18n } from './types' 4 | 5 | /** 6 | * Returns the i18n instance. 7 | */ 8 | export function useI18n(): I18n { 9 | return inject(vueI18nKey)! 10 | } 11 | -------------------------------------------------------------------------------- /src/globalExtensions.ts: -------------------------------------------------------------------------------- 1 | import { I18nLocale, I18nValues } from './types' 2 | 3 | declare module '@vue/runtime-core' { 4 | export interface ComponentCustomProperties { 5 | $t(key: string, values?: I18nValues): string 6 | $t(key: string, locale: I18nLocale): string 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "serve": "vite" 7 | }, 8 | "dependencies": { 9 | "@vue/compiler-sfc": "^3.0.11" 10 | }, 11 | "devDependencies": { 12 | "@vitejs/plugin-vue": "^1.2.2", 13 | "@vitejs/plugin-vue-jsx": "^1.1.3", 14 | "vite": "^2.2.3" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vue i18n lite 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/injectionSymbols.ts: -------------------------------------------------------------------------------- 1 | import { InjectionKey } from 'vue' 2 | import { I18n } from './types' 3 | 4 | export const hasSymbol = 5 | typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol' 6 | 7 | export const PolySymbol = (name: string) => 8 | hasSymbol ? Symbol(name) : '_vt_' + name 9 | 10 | export const vueI18nKey = /*#__PURE__*/ PolySymbol('i18n') as InjectionKey 11 | -------------------------------------------------------------------------------- /playground/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import { createI18n } from '../../src' 4 | 5 | const i18n = createI18n({ 6 | locale: 'en', 7 | messages: { 8 | en: { 9 | button: { 10 | add: 'Add new', 11 | }, 12 | }, 13 | vi: { 14 | button: { 15 | add: 'Thêm mới', 16 | }, 17 | }, 18 | }, 19 | }) 20 | 21 | const app = createApp(App) 22 | app.use(i18n) 23 | app.mount('#app') 24 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | globals: { 4 | __DEV__: true, 5 | __BROWSER__: true, 6 | }, 7 | coverageDirectory: 'coverage', 8 | coverageReporters: ['html', 'lcov', 'text'], 9 | collectCoverageFrom: ['src/**/*.ts'], 10 | coveragePathIgnorePatterns: [ 11 | '/node_modules/', 12 | 'src/index.ts', 13 | ], 14 | testMatch: ['/__tests__/**/*.spec.ts?(x)'], 15 | watchPathIgnorePatterns: ['/node_modules'], 16 | testEnvironment: 'jsdom', 17 | } 18 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [1.0.2](https://github.com/FrontLabsOfficial/vue-i18n-lite/compare/v1.0.1...v1.0.2) (2021-08-05) 2 | 3 | 4 | ### Features 5 | 6 | * add fallback locale ([e085e3b](https://github.com/FrontLabsOfficial/vue-i18n-lite/commit/e085e3b43546c316dcdf0affd875d3d142853975)) 7 | 8 | 9 | 10 | ## [1.0.1](https://github.com/FrontLabsOfficial/vue-i18n-lite/compare/v1.0.0...v1.0.1) (2021-05-04) 11 | 12 | 13 | ### Bug Fixes 14 | 15 | * optional chaining ([26b83b7](https://github.com/FrontLabsOfficial/vue-i18n-lite/commit/26b83b73bb2b54ec56a7caff353b1dd27aef35f0)) 16 | 17 | 18 | 19 | # 1.0.0 (2021-05-01) 20 | 21 | 22 | ### Features 23 | 24 | * init ([71a5641](https://github.com/FrontLabsOfficial/vue-i18n-lite/commit/71a5641dd615887870e8b93ee7b299cd8c83a679)) 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/global.d.ts", "src/**/*.ts", "__tests__/**/*.ts"], 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": ".", 6 | "outDir": "dist", 7 | "sourceMap": false, 8 | "noEmit": true, 9 | 10 | "target": "esnext", 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "allowJs": false, 14 | 15 | "noUnusedLocals": true, 16 | "strictNullChecks": true, 17 | "noImplicitAny": true, 18 | "noImplicitThis": true, 19 | "noImplicitReturns": true, 20 | "strict": true, 21 | "isolatedModules": false, 22 | 23 | "experimentalDecorators": true, 24 | "resolveJsonModule": true, 25 | "esModuleInterop": true, 26 | "removeComments": false, 27 | "jsx": "preserve", 28 | "lib": ["esnext", "dom"], 29 | "types": ["jest", "node"] 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /scripts/verifyCommit.js: -------------------------------------------------------------------------------- 1 | // Invoked on the commit-msg git hook by yorkie. 2 | 3 | const chalk = require('chalk') 4 | const msgPath = process.env.GIT_PARAMS 5 | const msg = require('fs').readFileSync(msgPath, 'utf-8').trim() 6 | 7 | const commitRE = /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release)(\(.+\))?: .{1,50}/ 8 | 9 | if (!commitRE.test(msg)) { 10 | console.log() 11 | console.error( 12 | ` ${chalk.bgRed.white(' ERROR ')} ${chalk.red( 13 | `invalid commit message format.` 14 | )}\n\n` + 15 | chalk.red( 16 | ` Proper commit message format is required for automated changelog generation. Examples:\n\n` 17 | ) + 18 | ` ${chalk.green( 19 | `fix(view): handle keep-alive with aborted navigations` 20 | )}\n` + 21 | ` ${chalk.green( 22 | `fix(view): handle keep-alive with aborted navigations (close #28)` 23 | )}\n\n` + 24 | chalk.red(` See .github/commit-convention.md for more details.\n`) 25 | ) 26 | process.exit(1) 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Front Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /api-extractor.json: -------------------------------------------------------------------------------- 1 | // this the shared base config for all packages. 2 | { 3 | "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", 4 | 5 | "mainEntryPointFilePath": "./dist/src/index.d.ts", 6 | 7 | "apiReport": { 8 | "enabled": true, 9 | "reportFolder": "/temp/" 10 | }, 11 | 12 | "docModel": { 13 | "enabled": true 14 | }, 15 | 16 | "dtsRollup": { 17 | "enabled": true, 18 | "untrimmedFilePath": "./dist/.d.ts" 19 | }, 20 | 21 | "tsdocMetadata": { 22 | "enabled": false 23 | }, 24 | 25 | "messages": { 26 | "compilerMessageReporting": { 27 | "default": { 28 | "logLevel": "warning" 29 | } 30 | }, 31 | 32 | "extractorMessageReporting": { 33 | "default": { 34 | "logLevel": "warning", 35 | "addToApiReportFile": true 36 | }, 37 | 38 | "ae-missing-release-tag": { 39 | "logLevel": "none" 40 | } 41 | }, 42 | 43 | "tsdocMessageReporting": { 44 | "default": { 45 | "logLevel": "warning" 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /__tests__/utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | getMessage, 3 | isValidPath, 4 | parseLocaleValues, 5 | parsePath, 6 | replaceLocaleValues, 7 | } from '../src/utils' 8 | 9 | describe('Utils', () => { 10 | describe('parsePath', () => { 11 | it('valid path', () => { 12 | const paths = parsePath('a.b.c') 13 | expect(paths).toEqual(['a', 'b', 'c']) 14 | }) 15 | 16 | it('invalid path', () => { 17 | const paths = parsePath('a/b/c') 18 | expect(paths).toHaveLength(1) 19 | }) 20 | }) 21 | 22 | describe('isValidPath', () => { 23 | it('valid', () => { 24 | expect(isValidPath(['a', 'b', 'c'])).toBeTruthy() 25 | }) 26 | }) 27 | 28 | describe('getMessages', () => { 29 | it('default', () => { 30 | expect(getMessage({ home: 'Home' }, 'home')).toEqual('Home') 31 | }) 32 | 33 | it('not exists', () => { 34 | expect(getMessage({}, 'home.button.add')).toEqual('') 35 | }) 36 | }) 37 | 38 | describe('locale values', () => { 39 | const message = 'Total: {total}. Amount: ${amount}' 40 | const values = { total: 10, amount: 100 } 41 | 42 | it('values is object', () => { 43 | expect(parseLocaleValues(message, values)).toEqual(values) 44 | }) 45 | 46 | it('values is array', () => { 47 | expect(parseLocaleValues(message, [10, 100])).toEqual(values) 48 | }) 49 | 50 | it('replace values', () => { 51 | expect(replaceLocaleValues(message, values)).toEqual( 52 | 'Total: 10. Amount: $100' 53 | ) 54 | }) 55 | }) 56 | }) 57 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { App, Ref } from 'vue' 2 | import { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity' 3 | 4 | /** 5 | * I18n options 6 | */ 7 | export type I18nOptions = { 8 | locale?: string 9 | fallbackLocale?: string 10 | messages?: { 11 | [locale: string]: I18nLocaleMessages 12 | } 13 | } 14 | 15 | /** 16 | * I18n value 17 | */ 18 | export type I18nValue = number | string 19 | 20 | /** 21 | * I18n value object 22 | */ 23 | export type I18nValueObject = { [k: string]: I18nValue } 24 | 25 | /** 26 | * I18n values 27 | */ 28 | export type I18nValues = I18nValue[] | I18nValueObject 29 | 30 | /** 31 | * I18n locale 32 | */ 33 | export type I18nLocale = string 34 | 35 | /** 36 | * I18n locale message 37 | */ 38 | export type I18nLocaleMessage = string 39 | 40 | /** 41 | * I18n locale message object 42 | */ 43 | export type I18nLocaleMessageObject = { 44 | [k: string]: I18nLocaleMessageObject | I18nLocaleMessage 45 | } 46 | 47 | /** 48 | * I18n locale messages 49 | */ 50 | export type I18nLocaleMessages = { 51 | [k: string]: I18nLocaleMessageObject | I18nLocaleMessage 52 | } 53 | 54 | /** 55 | * I18n locales 56 | */ 57 | export type I18nLocales = UnwrapNestedRefs<{ 58 | [k: string]: I18nLocaleMessages 59 | }> 60 | 61 | /** 62 | * I18n instance 63 | */ 64 | export type I18n = { 65 | current: DeepReadonly>> 66 | options: DeepReadonly> 67 | setLocaleMessage(locale: I18nLocale, messages: I18nLocaleMessages): void 68 | getLocaleMessage(locale: I18nLocale): I18nLocaleMessages 69 | changeLocale(locale: I18nLocale): void 70 | install(app: App): void 71 | t(key: string, values?: I18nValues): string 72 | t(key: string, locale?: I18nLocale): string 73 | } 74 | -------------------------------------------------------------------------------- /playground/src/App.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 🔥️ Vue I18n Lite 2 | 3 | A super lightweight and minimal plugin that introduces internationalization into your Vue.js app with a simple API 4 | 5 | ## 🚀 Usage 6 | ### Plugin 7 | 8 | ```ts 9 | import { createApp } from 'vue'; 10 | import { createI18n } from 'vue-i18n-lite'; 11 | import App from './App.vue'; 12 | 13 | const i18n = createI18n({ 14 | locale: 'en', 15 | fallbackLocale: 'en', 16 | messages: { 17 | 'en': { 18 | home: 'Home' 19 | } 20 | } 21 | }) 22 | 23 | const app = createApp(App); 24 | app.use(i18n); 25 | 26 | ``` 27 | ### Composition API 28 | 29 | ```ts 30 | import { useI18n } from 'vue-i18n-lite'; 31 | 32 | export default { 33 | setup() { 34 | const i18n = useI18n() 35 | i18n.createI18n({ 36 | locale: 'en', 37 | fallbackLocale: 'en', 38 | messages: { 39 | 'en': { 40 | home: 'Home' 41 | } 42 | } 43 | }) 44 | 45 | const { current, changeLocale } = i18n 46 | 47 | return { 48 | current, 49 | changeLocale 50 | } 51 | } 52 | } 53 | ``` 54 | 55 | ## 📦 Install 56 | 57 | ```bash 58 | yarn add vue-i18n-lite 59 | ``` 60 | 61 | ### CDN 62 | 63 | ```html 64 | 65 | ``` 66 | 67 | It will be exposed to global as `window.VueI18nLite` 68 | 69 | ## Changelog 70 | 71 | Detail changes for each release are documented in the [`CHANGELOG.md file`](https://github.com/FrontLabsOfficial/vue-i18n-lite/blob/master/CHANGELOG.md). 72 | 73 | ## ❤️ Thanks 74 | 75 | This project is inspired by the following awesome projects. 76 | - [dot-prop](https://github.com/sindresorhus/dot-prop) 77 | - [vue-i18n](https://github.com/kazupon/vue-i18n) 78 | 79 | ## 📄 License 80 | 81 | MIT License © 2021 [Erik Pham](https://github.com/erikpham) 82 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { App, ref, reactive, readonly, toRaw } from 'vue' 2 | import { 3 | getMessage, 4 | isEmpty, 5 | mergeDeep, 6 | parseLocaleValues, 7 | replaceLocaleValues, 8 | } from './utils' 9 | import { 10 | I18nOptions, 11 | I18nLocale, 12 | I18nLocales, 13 | I18n, 14 | I18nValues, 15 | I18nLocaleMessages, 16 | } from './types' 17 | import { vueI18nKey } from './injectionSymbols' 18 | 19 | /** 20 | * Creates a I18n instance that can be used by a Vue app. 21 | * 22 | * @param options - {@link I18nOptions} 23 | */ 24 | export function createI18n(options?: I18nOptions): I18n { 25 | const initOptions = Object.assign( 26 | { locale: 'en', fallbackLocale: 'en', messages: {} }, 27 | options 28 | ) 29 | const current = ref(initOptions.locale) 30 | const locales: I18nLocales = reactive({}) 31 | Object.entries(initOptions.messages).forEach(([key, messages]) => { 32 | locales[key] = messages 33 | }) 34 | 35 | return { 36 | t(key: string, option?: I18nLocale | I18nValues): string { 37 | if (!key) { 38 | return '' 39 | } 40 | 41 | const locale = 42 | typeof option === 'string' && option ? option : current.value 43 | 44 | let message = 45 | getMessage(locales[locale], key) || 46 | getMessage(locales[initOptions.fallbackLocale], key) 47 | if (option && typeof option !== 'string') { 48 | const values = parseLocaleValues(message, option) 49 | if (!isEmpty(values)) { 50 | message = replaceLocaleValues(message, values) 51 | } 52 | } 53 | 54 | return message || key 55 | }, 56 | current: readonly(current), 57 | options: readonly(options || {}), 58 | install(app: App) { 59 | const context = this 60 | app.config.globalProperties.$t = context.t 61 | app.provide(vueI18nKey, context) 62 | }, 63 | changeLocale(locale: string) { 64 | current.value = locale 65 | }, 66 | setLocaleMessage(locale: string, messages: I18nLocaleMessages) { 67 | locales[locale] = mergeDeep(toRaw(locales[locale] || {}), messages) 68 | }, 69 | getLocaleMessage(locale: I18nLocale): I18nLocaleMessages { 70 | return locales[locale] || {} 71 | }, 72 | } 73 | } 74 | 75 | export * from './useApi' 76 | export * from './globalExtensions' 77 | export * from './types' 78 | 79 | /** 80 | * Super lightweight internationalization (i18n) plugin for Vue 3 81 | * 82 | * @packageDocumentation 83 | */ 84 | -------------------------------------------------------------------------------- /__tests__/i18n.spec.ts: -------------------------------------------------------------------------------- 1 | import { createI18n } from '../src' 2 | import { I18n } from '../src' 3 | 4 | const defaultMessages = { 5 | home: { 6 | general: { 7 | button: 'Home', 8 | }, 9 | }, 10 | } 11 | 12 | describe('i18n', () => { 13 | describe('Init', () => { 14 | it('create plugin', () => { 15 | const plugin = createI18n() 16 | expect(plugin.current.value).toEqual('en') 17 | }) 18 | 19 | it('create plugin with options', () => { 20 | const plugin = createI18n({ 21 | locale: 'vi', 22 | }) 23 | expect(plugin.current.value).toEqual('vi') 24 | }) 25 | }) 26 | 27 | describe('Plugin', () => { 28 | let plugin: I18n 29 | beforeEach(() => { 30 | plugin = createI18n({ 31 | locale: 'en', 32 | messages: { 33 | en: defaultMessages, 34 | }, 35 | }) 36 | }) 37 | 38 | it('message', () => { 39 | expect(plugin.t('home.general.button')).toEqual('Home') 40 | }) 41 | 42 | it('extend and override message', () => { 43 | const messages = { 44 | home: { 45 | general: { 46 | button: 'Add to cart', 47 | cancel: 'Cancel', 48 | }, 49 | }, 50 | } 51 | 52 | plugin.setLocaleMessage('en', messages) 53 | expect(plugin.t('home.general.button')).toEqual( 54 | messages.home.general.button 55 | ) 56 | expect(plugin.t('home.general.cancel')).toEqual( 57 | messages.home.general.cancel 58 | ) 59 | }) 60 | 61 | it('change locale', () => { 62 | const messages = { 63 | home: { 64 | general: { 65 | button: 'Trang chủ', 66 | }, 67 | }, 68 | } 69 | 70 | plugin.setLocaleMessage('vi', messages) 71 | plugin.changeLocale('vi') 72 | expect(plugin.t('home.general.button')).toEqual( 73 | messages.home.general.button 74 | ) 75 | }) 76 | 77 | it('message with values', () => { 78 | const messages = { 79 | cart: { 80 | alert: 'Total products {total}. Total amount: ${amount}', 81 | }, 82 | } 83 | 84 | plugin.setLocaleMessage('en', messages) 85 | expect(plugin.t('cart.alert', { total: 10, amount: 9999 })).toEqual( 86 | 'Total products 10. Total amount: $9999' 87 | ) 88 | expect(plugin.t('cart.alert', [10])).toEqual( 89 | 'Total products 10. Total amount: ${amount}' 90 | ) 91 | }) 92 | }) 93 | }) 94 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-i18n-lite", 3 | "version": "1.0.2", 4 | "main": "dist/vue-i18n-lite.cjs.js", 5 | "unpkg": "dist/vue-i18n-lite.global.js", 6 | "jsdelivr": "dist/vue-i18n-lite.global.js", 7 | "module": "dist/vue-i18n-lite.esm-bundler.js", 8 | "types": "dist/vue-i18n-lite.d.ts", 9 | "sideEffects": false, 10 | "scripts": { 11 | "serve": "cd playground && yarn serve", 12 | "build": "rollup -c rollup.config.js", 13 | "build:dts": "api-extractor run --local --verbose && tail -n +2 src/globalExtensions.ts >> dist/vue-i18n-lite.d.ts", 14 | "test": "jest", 15 | "release": "node scripts/release.js", 16 | "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 1" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/FrontLabsOfficial/vue-i18n-lite.git" 21 | }, 22 | "keywords": [ 23 | "vue", 24 | "i18n", 25 | "vue-i18n", 26 | "vue-i18n-lite" 27 | ], 28 | "author": "Erik Pham", 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/FrontLabsOfficial/vue-i18n-lite/issues" 32 | }, 33 | "homepage": "https://github.com/FrontLabsOfficial/vue-i18n-lite/tree/master#readme", 34 | "files": [ 35 | "dist/*.js", 36 | "dist/vue-i18n-lite.d.ts", 37 | "README.md" 38 | ], 39 | "devDependencies": { 40 | "@microsoft/api-extractor": "^7.14.0", 41 | "@rollup/plugin-commonjs": "^18.0.0", 42 | "@rollup/plugin-node-resolve": "^11.2.1", 43 | "@rollup/plugin-replace": "^2.4.2", 44 | "@types/jest": "^26.0.23", 45 | "@vitejs/plugin-vue": "^1.3.0", 46 | "@vue/compiler-sfc": "^3.1.5", 47 | "chalk": "^4.1.1", 48 | "conventional-changelog-cli": "^2.1.1", 49 | "enquirer": "^2.3.6", 50 | "execa": "^5.0.0", 51 | "jest": "^26.6.3", 52 | "lint-staged": "^10.5.4", 53 | "minimist": "^1.2.5", 54 | "prettier": "2.2.1", 55 | "rollup": "^2.45.2", 56 | "rollup-plugin-terser": "^7.0.2", 57 | "rollup-plugin-typescript2": "^0.30.0", 58 | "semver": "^7.3.5", 59 | "ts-jest": "^26.5.5", 60 | "typescript": "^4.2.4", 61 | "vite": "^2.4.4", 62 | "vue": "3.0.11", 63 | "yorkie": "^2.0.0" 64 | }, 65 | "gitHooks": { 66 | "pre-commit": "lint-staged", 67 | "commit-msg": "node scripts/verifyCommit.js" 68 | }, 69 | "lint-staged": { 70 | "*.js": [ 71 | "prettier --write" 72 | ], 73 | "*.ts?(x)": [ 74 | "prettier --parser=typescript --write" 75 | ] 76 | }, 77 | "peerDependencies": { 78 | "vue": "^3.0.0" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | import { I18nLocaleMessageObject, I18nValueObject, I18nValues } from '../types' 2 | 3 | const disallowedKeys = ['__proto__', 'prototype', 'constructor'] 4 | 5 | /** 6 | * Is object 7 | * @param value 8 | */ 9 | export function isObject(value: any): boolean { 10 | const type = typeof value 11 | return value !== null && (type === 'object' || type === 'function') 12 | } 13 | 14 | /** 15 | * Check is empty 16 | * @param obj 17 | */ 18 | export function isEmpty(obj: Array | Object): boolean { 19 | return !(Array.isArray(obj) ? obj.length : Object.keys(obj).length) 20 | } 21 | 22 | /** 23 | * Is valid path 24 | * @param segments 25 | */ 26 | export function isValidPath(segments: Array): boolean { 27 | return !segments.some( 28 | (segment: string) => disallowedKeys.indexOf(segment) !== -1 29 | ) 30 | } 31 | 32 | /** 33 | * Parse path 34 | * @param path 35 | */ 36 | export function parsePath(path: string): Array { 37 | const pathArray = path.split('.') 38 | const parts = [] 39 | 40 | for (let i = 0; i < pathArray.length; i++) { 41 | let p = pathArray[i] 42 | 43 | while (p[p.length - 1] === '\\' && pathArray[i + 1] !== undefined) { 44 | p = p.slice(0, -1) + '.' 45 | p += pathArray[++i] 46 | } 47 | 48 | parts.push(p) 49 | } 50 | 51 | if (!isValidPath(parts)) { 52 | return [] 53 | } 54 | 55 | return parts 56 | } 57 | 58 | /** 59 | * Get object value by path 60 | * @param object 61 | * @param path 62 | */ 63 | export function getMessage( 64 | object: I18nLocaleMessageObject, 65 | path: string 66 | ): string { 67 | if (!isObject(object)) { 68 | return '' 69 | } 70 | 71 | const paths = parsePath(path) 72 | if (paths.length === 0) { 73 | return '' 74 | } 75 | 76 | let rawObject = Object.assign({}, object) 77 | for (let i = 0; i < paths.length; i++) { 78 | if (typeof rawObject[paths[i]] === 'string') { 79 | return rawObject[paths[i]] as string 80 | } 81 | 82 | rawObject = rawObject[paths[i]] as I18nLocaleMessageObject 83 | if (rawObject === undefined || rawObject === null) { 84 | if (i !== paths.length - 1) { 85 | return '' 86 | } 87 | 88 | break 89 | } 90 | } 91 | 92 | return '' 93 | } 94 | 95 | /** 96 | * Parse locale values 97 | * @param message 98 | * @param values 99 | */ 100 | export function parseLocaleValues( 101 | message: string, 102 | values: I18nValues 103 | ): I18nValueObject { 104 | if (Array.isArray(values)) { 105 | const parseValues: I18nValueObject = {} 106 | const matches = [...message.matchAll(/{(.+?)}/g)] 107 | if (matches) { 108 | matches.forEach((match, index) => { 109 | if (values[index]) { 110 | parseValues[match[1]] = values[index] 111 | } 112 | }) 113 | } 114 | 115 | return parseValues 116 | } 117 | 118 | return values as I18nValueObject 119 | } 120 | 121 | /** 122 | * Replace locale values to message 123 | * @param message 124 | * @param values 125 | */ 126 | export function replaceLocaleValues( 127 | message: string, 128 | values: I18nValueObject 129 | ): string { 130 | for (const key in values) { 131 | message = message.replace(`{${key}}`, String(values[key])) 132 | } 133 | 134 | return message 135 | } 136 | 137 | /** 138 | * Merge deep 139 | * @param target 140 | * @param source 141 | */ 142 | export function mergeDeep( 143 | target: Record, 144 | source: Record 145 | ): Record { 146 | Object.keys(source).forEach(key => { 147 | if (source[key] instanceof Object && key in target) { 148 | source[key] = { ...source[key], ...mergeDeep(target[key], source[key]) } 149 | } 150 | }) 151 | 152 | return { ...(target || {}), ...source } 153 | } 154 | -------------------------------------------------------------------------------- /scripts/release.js: -------------------------------------------------------------------------------- 1 | const args = require('minimist')(process.argv.slice(2)) 2 | const path = require('path') 3 | const fs = require('fs') 4 | const chalk = require('chalk') 5 | const semver = require('semver') 6 | const currentVersion = require('../package.json').version 7 | const { prompt } = require('enquirer') 8 | const execa = require('execa') 9 | const step = msg => console.log(chalk.cyan(msg)) 10 | 11 | const preId = 12 | args.preid || 13 | (semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0]) 14 | const isDryRun = args.dry 15 | const skipTests = args.skipTests 16 | 17 | const versionIncrements = [ 18 | 'patch', 19 | 'minor', 20 | 'major', 21 | ...(preId ? ['prepatch', 'preminor', 'premajor', 'prerelease'] : []), 22 | ] 23 | 24 | const inc = i => semver.inc(currentVersion, i, preId) 25 | const bin = name => path.resolve(__dirname, '../node_modules/.bin/' + name) 26 | const run = (bin, args, opts = {}) => 27 | execa(bin, args, { stdio: 'inherit', ...opts }) 28 | const dryRun = (bin, args, opts = {}) => 29 | console.log(chalk.blue(`[dryrun] ${bin} ${args.join(' ')}`), opts) 30 | const runIfNotDry = isDryRun ? dryRun : run 31 | 32 | async function main() { 33 | let targetVersion = args._[0] 34 | 35 | if (!targetVersion) { 36 | // no explicit version, offer suggestions 37 | const { release } = await prompt({ 38 | type: 'select', 39 | name: 'release', 40 | message: 'Select release type', 41 | choices: versionIncrements 42 | .map(i => `${i} (${inc(i)})`) 43 | .concat(['custom']), 44 | }) 45 | 46 | if (release === 'custom') { 47 | targetVersion = ( 48 | await prompt({ 49 | type: 'input', 50 | name: 'version', 51 | message: 'Input custom version', 52 | initial: currentVersion, 53 | }) 54 | ).version 55 | } else { 56 | targetVersion = release.match(/\((.*)\)/)[1] 57 | } 58 | } 59 | 60 | if (!semver.valid(targetVersion)) { 61 | throw new Error(`invalid target version: ${targetVersion}`) 62 | } 63 | 64 | const { yes } = await prompt({ 65 | type: 'confirm', 66 | name: 'yes', 67 | message: `Releasing v${targetVersion}. Confirm?`, 68 | }) 69 | 70 | if (!yes) { 71 | return 72 | } 73 | 74 | // Run test 75 | step('\nRunning tests...') 76 | if (!skipTests && !isDryRun) { 77 | await run(bin('jest'), ['--clearCache']) 78 | await run('yarn', ['test', '--bail']) 79 | } else { 80 | console.log(`(skipped)`) 81 | } 82 | 83 | // Update package 84 | step('\nUpdate package') 85 | if (!isDryRun) { 86 | await updatePackage(targetVersion) 87 | } else { 88 | console.log(`(skipped)`) 89 | } 90 | 91 | step('\nBuilding package...') 92 | if (!isDryRun) { 93 | await run('yarn', ['build']) 94 | await run('yarn', ['build:dts']) 95 | } else { 96 | console.log(`(skipped)`) 97 | } 98 | 99 | // Generate changelog 100 | if (!isDryRun) { 101 | await run(`yarn`, ['changelog']) 102 | } 103 | 104 | const { stdout } = await run('git', ['diff'], { stdio: 'pipe' }) 105 | if (stdout) { 106 | step('\nCommitting changes...') 107 | await runIfNotDry('git', ['add', '-A']) 108 | await runIfNotDry('git', ['commit', '-m', `release: v${targetVersion}`]) 109 | } else { 110 | console.log('No changes to commit.') 111 | } 112 | 113 | // Publish packages 114 | await publishPackage(targetVersion, runIfNotDry) 115 | 116 | // Push to GitHub 117 | step('\nPushing to GitHub...') 118 | await runIfNotDry('git', ['tag', `v${targetVersion}`]) 119 | await runIfNotDry('git', ['push', 'origin', `refs/tags/v${targetVersion}`]) 120 | await runIfNotDry('git', ['push']) 121 | 122 | if (isDryRun) { 123 | console.log(`\nDry run finished - run git diff to see package changes.`) 124 | } 125 | console.log() 126 | } 127 | 128 | /** 129 | * Public package to npm 130 | * @param version 131 | * @param runIfNotDry 132 | * @returns {Promise} 133 | */ 134 | async function publishPackage(version, runIfNotDry) { 135 | const root = path.resolve(__dirname, '..') 136 | const pkgPath = path.resolve(root, 'package.json') 137 | const pkg = require(pkgPath) 138 | const pkgName = pkg.name 139 | if (pkg.private) { 140 | return 141 | } 142 | 143 | const prerelease = semver.prerelease(version) 144 | const releaseTag = prerelease ? prerelease[0] : null 145 | 146 | step(`Publishing ${pkgName}...`) 147 | try { 148 | await runIfNotDry( 149 | 'yarn', 150 | [ 151 | 'publish', 152 | '--new-version', 153 | version, 154 | ...(releaseTag ? ['--tag', releaseTag] : []), 155 | '--access', 156 | 'public', 157 | ], 158 | { 159 | cwd: root, 160 | stdio: 'pipe', 161 | } 162 | ) 163 | console.log(chalk.green(`Successfully published ${pkgName}@${version}`)) 164 | } catch (e) { 165 | if (e.stderr.match(/previously published/)) { 166 | console.log(chalk.red(`Skipping already published: ${pkgName}`)) 167 | } else { 168 | throw e 169 | } 170 | } 171 | } 172 | 173 | /** 174 | * Update package version 175 | * @param version 176 | * @returns {Promise} 177 | */ 178 | async function updatePackage(version) { 179 | const root = path.resolve(__dirname, '..') 180 | const pkgPath = path.resolve(root, 'package.json') 181 | const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) 182 | pkg.version = version 183 | fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') 184 | } 185 | 186 | main().catch(e => { 187 | console.error(e) 188 | }) 189 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import ts from 'rollup-plugin-typescript2' 3 | import replace from '@rollup/plugin-replace' 4 | import resolve from '@rollup/plugin-node-resolve' 5 | import commonjs from '@rollup/plugin-commonjs' 6 | 7 | const pkg = require('./package.json') 8 | const name = pkg.name 9 | 10 | const banner = `/*! 11 | * ${pkg.name} v${pkg.version} 12 | * (c) ${new Date().getFullYear()} Erik Pham 13 | * @license MIT 14 | */` 15 | 16 | // ensure TS checks only once for each build 17 | let hasTSChecked = false 18 | 19 | const outputConfigs = { 20 | // each file name has the format: `dist/${name}.${format}.js` 21 | // format being a key of this object 22 | 'esm-bundler': { 23 | file: pkg.module, 24 | format: `es`, 25 | }, 26 | cjs: { 27 | file: pkg.main, 28 | format: `cjs`, 29 | }, 30 | global: { 31 | file: pkg.unpkg, 32 | format: `iife`, 33 | }, 34 | esm: { 35 | file: pkg.browser || pkg.module.replace('bundler', 'browser'), 36 | format: `es`, 37 | }, 38 | } 39 | 40 | const allFormats = Object.keys(outputConfigs) 41 | const packageFormats = allFormats 42 | const packageConfigs = packageFormats.map(format => 43 | createConfig(format, outputConfigs[format]) 44 | ) 45 | 46 | // only add the production ready if we are bundling the options 47 | packageFormats.forEach(format => { 48 | if (format === 'cjs') { 49 | packageConfigs.push(createProductionConfig(format)) 50 | } else if (format === 'global') { 51 | packageConfigs.push(createMinifiedConfig(format)) 52 | } 53 | }) 54 | 55 | export default packageConfigs 56 | 57 | function createConfig(format, output, plugins = []) { 58 | if (!output) { 59 | console.log(require('chalk').yellow(`invalid format: "${format}"`)) 60 | process.exit(1) 61 | } 62 | 63 | output.sourcemap = !!process.env.SOURCE_MAP 64 | output.banner = banner 65 | output.externalLiveBindings = false 66 | output.globals = { 67 | vue: 'Vue', 68 | } 69 | 70 | const isProductionBuild = /\.prod\.js$/.test(output.file) 71 | const isGlobalBuild = format === 'global' 72 | const isRawESMBuild = format === 'esm' 73 | const isNodeBuild = format === 'cjs' 74 | const isBundlerESMBuild = /esm-bundler/.test(format) 75 | 76 | if (isGlobalBuild) { 77 | output.name = 'VueI18nLite' 78 | } 79 | 80 | const shouldEmitDeclarations = !hasTSChecked 81 | 82 | const tsPlugin = ts({ 83 | check: !hasTSChecked, 84 | tsconfig: path.resolve(__dirname, 'tsconfig.json'), 85 | cacheRoot: path.resolve(__dirname, 'node_modules/.rts2_cache'), 86 | tsconfigOverride: { 87 | compilerOptions: { 88 | sourceMap: output.sourcemap, 89 | declaration: shouldEmitDeclarations, 90 | declarationMap: shouldEmitDeclarations, 91 | }, 92 | exclude: ['__tests__', 'test-dts'], 93 | }, 94 | }) 95 | // we only need to check TS and generate declarations once for each build. 96 | // it also seems to run into weird issues when checking multiple times 97 | // during a single build. 98 | hasTSChecked = true 99 | 100 | const external = [ 101 | 'vue', 102 | ] 103 | 104 | const nodePlugins = [resolve(), commonjs()] 105 | 106 | return { 107 | input: `src/index.ts`, 108 | // Global and Browser ESM builds inlines everything so that they can be 109 | // used alone. 110 | external, 111 | plugins: [ 112 | tsPlugin, 113 | createReplacePlugin( 114 | isProductionBuild, 115 | isBundlerESMBuild, 116 | // isBrowserBuild? 117 | isGlobalBuild || isRawESMBuild || isBundlerESMBuild, 118 | isGlobalBuild, 119 | isNodeBuild 120 | ), 121 | ...nodePlugins, 122 | ...plugins, 123 | ], 124 | output, 125 | } 126 | } 127 | 128 | function createReplacePlugin( 129 | isProduction, 130 | isBundlerESMBuild, 131 | isBrowserBuild, 132 | isGlobalBuild, 133 | isNodeBuild 134 | ) { 135 | const replacements = { 136 | __COMMIT__: `"${process.env.COMMIT}"`, 137 | __VERSION__: `"${pkg.version}"`, 138 | __DEV__: isBundlerESMBuild 139 | ? // preserve to be handled by bundlers 140 | `(process.env.NODE_ENV !== 'production')` 141 | : // hard coded dev/prod builds 142 | !isProduction, 143 | // this is only used during tests 144 | __TEST__: isBundlerESMBuild ? `(process.env.NODE_ENV === 'test')` : false, 145 | // If the build is expected to run directly in the browser (global / esm builds) 146 | __BROWSER__: isBrowserBuild, 147 | __FEATURE_PROD_DEVTOOLS__: isBundlerESMBuild 148 | ? `__VUE_PROD_DEVTOOLS__` 149 | : false, 150 | // is targeting bundlers? 151 | __BUNDLER__: isBundlerESMBuild, 152 | __GLOBAL__: isGlobalBuild, 153 | // is targeting Node (SSR)? 154 | __NODE_JS__: isNodeBuild, 155 | } 156 | // allow inline overrides like 157 | //__RUNTIME_COMPILE__=true yarn build 158 | Object.keys(replacements).forEach(key => { 159 | if (key in process.env) { 160 | replacements[key] = process.env[key] 161 | } 162 | }) 163 | return replace(replacements) 164 | } 165 | 166 | function createProductionConfig(format) { 167 | return createConfig(format, { 168 | file: `dist/${name}.${format}.prod.js`, 169 | format: outputConfigs[format].format, 170 | }) 171 | } 172 | 173 | function createMinifiedConfig(format) { 174 | const { terser } = require('rollup-plugin-terser') 175 | return createConfig( 176 | format, 177 | { 178 | file: `dist/${name}.${format}.prod.js`, 179 | format: outputConfigs[format].format, 180 | }, 181 | [ 182 | terser({ 183 | module: /^esm/.test(format), 184 | compress: { 185 | ecma: 2015, 186 | pure_getters: true, 187 | }, 188 | }), 189 | ] 190 | ) 191 | } 192 | -------------------------------------------------------------------------------- /playground/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.12.13": 6 | version "7.12.13" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" 8 | integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== 9 | dependencies: 10 | "@babel/highlight" "^7.12.13" 11 | 12 | "@babel/compat-data@^7.13.15": 13 | version "7.13.15" 14 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" 15 | integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== 16 | 17 | "@babel/core@^7.12.10": 18 | version "7.13.16" 19 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" 20 | integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== 21 | dependencies: 22 | "@babel/code-frame" "^7.12.13" 23 | "@babel/generator" "^7.13.16" 24 | "@babel/helper-compilation-targets" "^7.13.16" 25 | "@babel/helper-module-transforms" "^7.13.14" 26 | "@babel/helpers" "^7.13.16" 27 | "@babel/parser" "^7.13.16" 28 | "@babel/template" "^7.12.13" 29 | "@babel/traverse" "^7.13.15" 30 | "@babel/types" "^7.13.16" 31 | convert-source-map "^1.7.0" 32 | debug "^4.1.0" 33 | gensync "^1.0.0-beta.2" 34 | json5 "^2.1.2" 35 | semver "^6.3.0" 36 | source-map "^0.5.0" 37 | 38 | "@babel/generator@^7.13.16": 39 | version "7.13.16" 40 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" 41 | integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== 42 | dependencies: 43 | "@babel/types" "^7.13.16" 44 | jsesc "^2.5.1" 45 | source-map "^0.5.0" 46 | 47 | "@babel/helper-compilation-targets@^7.13.16": 48 | version "7.13.16" 49 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" 50 | integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== 51 | dependencies: 52 | "@babel/compat-data" "^7.13.15" 53 | "@babel/helper-validator-option" "^7.12.17" 54 | browserslist "^4.14.5" 55 | semver "^6.3.0" 56 | 57 | "@babel/helper-create-class-features-plugin@^7.13.0": 58 | version "7.13.11" 59 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" 60 | integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== 61 | dependencies: 62 | "@babel/helper-function-name" "^7.12.13" 63 | "@babel/helper-member-expression-to-functions" "^7.13.0" 64 | "@babel/helper-optimise-call-expression" "^7.12.13" 65 | "@babel/helper-replace-supers" "^7.13.0" 66 | "@babel/helper-split-export-declaration" "^7.12.13" 67 | 68 | "@babel/helper-function-name@^7.12.13": 69 | version "7.12.13" 70 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" 71 | integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== 72 | dependencies: 73 | "@babel/helper-get-function-arity" "^7.12.13" 74 | "@babel/template" "^7.12.13" 75 | "@babel/types" "^7.12.13" 76 | 77 | "@babel/helper-get-function-arity@^7.12.13": 78 | version "7.12.13" 79 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" 80 | integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== 81 | dependencies: 82 | "@babel/types" "^7.12.13" 83 | 84 | "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": 85 | version "7.13.12" 86 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" 87 | integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== 88 | dependencies: 89 | "@babel/types" "^7.13.12" 90 | 91 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.13.12": 92 | version "7.13.12" 93 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" 94 | integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== 95 | dependencies: 96 | "@babel/types" "^7.13.12" 97 | 98 | "@babel/helper-module-transforms@^7.13.14": 99 | version "7.13.14" 100 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" 101 | integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== 102 | dependencies: 103 | "@babel/helper-module-imports" "^7.13.12" 104 | "@babel/helper-replace-supers" "^7.13.12" 105 | "@babel/helper-simple-access" "^7.13.12" 106 | "@babel/helper-split-export-declaration" "^7.12.13" 107 | "@babel/helper-validator-identifier" "^7.12.11" 108 | "@babel/template" "^7.12.13" 109 | "@babel/traverse" "^7.13.13" 110 | "@babel/types" "^7.13.14" 111 | 112 | "@babel/helper-optimise-call-expression@^7.12.13": 113 | version "7.12.13" 114 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" 115 | integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== 116 | dependencies: 117 | "@babel/types" "^7.12.13" 118 | 119 | "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0": 120 | version "7.13.0" 121 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" 122 | integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== 123 | 124 | "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": 125 | version "7.13.12" 126 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" 127 | integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== 128 | dependencies: 129 | "@babel/helper-member-expression-to-functions" "^7.13.12" 130 | "@babel/helper-optimise-call-expression" "^7.12.13" 131 | "@babel/traverse" "^7.13.0" 132 | "@babel/types" "^7.13.12" 133 | 134 | "@babel/helper-simple-access@^7.13.12": 135 | version "7.13.12" 136 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" 137 | integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== 138 | dependencies: 139 | "@babel/types" "^7.13.12" 140 | 141 | "@babel/helper-split-export-declaration@^7.12.13": 142 | version "7.12.13" 143 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" 144 | integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== 145 | dependencies: 146 | "@babel/types" "^7.12.13" 147 | 148 | "@babel/helper-validator-identifier@^7.12.11": 149 | version "7.12.11" 150 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 151 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 152 | 153 | "@babel/helper-validator-option@^7.12.17": 154 | version "7.12.17" 155 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" 156 | integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== 157 | 158 | "@babel/helpers@^7.13.16": 159 | version "7.13.17" 160 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" 161 | integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== 162 | dependencies: 163 | "@babel/template" "^7.12.13" 164 | "@babel/traverse" "^7.13.17" 165 | "@babel/types" "^7.13.17" 166 | 167 | "@babel/highlight@^7.12.13": 168 | version "7.13.10" 169 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" 170 | integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== 171 | dependencies: 172 | "@babel/helper-validator-identifier" "^7.12.11" 173 | chalk "^2.0.0" 174 | js-tokens "^4.0.0" 175 | 176 | "@babel/parser@^7.12.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.16", "@babel/parser@^7.13.9": 177 | version "7.13.16" 178 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" 179 | integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== 180 | 181 | "@babel/plugin-syntax-import-meta@^7.10.4": 182 | version "7.10.4" 183 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" 184 | integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== 185 | dependencies: 186 | "@babel/helper-plugin-utils" "^7.10.4" 187 | 188 | "@babel/plugin-syntax-jsx@^7.0.0": 189 | version "7.12.13" 190 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" 191 | integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== 192 | dependencies: 193 | "@babel/helper-plugin-utils" "^7.12.13" 194 | 195 | "@babel/plugin-syntax-typescript@^7.12.13": 196 | version "7.12.13" 197 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" 198 | integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== 199 | dependencies: 200 | "@babel/helper-plugin-utils" "^7.12.13" 201 | 202 | "@babel/plugin-transform-typescript@^7.12.1": 203 | version "7.13.0" 204 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" 205 | integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== 206 | dependencies: 207 | "@babel/helper-create-class-features-plugin" "^7.13.0" 208 | "@babel/helper-plugin-utils" "^7.13.0" 209 | "@babel/plugin-syntax-typescript" "^7.12.13" 210 | 211 | "@babel/template@^7.0.0", "@babel/template@^7.12.13": 212 | version "7.12.13" 213 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" 214 | integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== 215 | dependencies: 216 | "@babel/code-frame" "^7.12.13" 217 | "@babel/parser" "^7.12.13" 218 | "@babel/types" "^7.12.13" 219 | 220 | "@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": 221 | version "7.13.17" 222 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" 223 | integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== 224 | dependencies: 225 | "@babel/code-frame" "^7.12.13" 226 | "@babel/generator" "^7.13.16" 227 | "@babel/helper-function-name" "^7.12.13" 228 | "@babel/helper-split-export-declaration" "^7.12.13" 229 | "@babel/parser" "^7.13.16" 230 | "@babel/types" "^7.13.17" 231 | debug "^4.1.0" 232 | globals "^11.1.0" 233 | 234 | "@babel/types@^7.0.0", "@babel/types@^7.12.0", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17": 235 | version "7.13.17" 236 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" 237 | integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== 238 | dependencies: 239 | "@babel/helper-validator-identifier" "^7.12.11" 240 | to-fast-properties "^2.0.0" 241 | 242 | "@vitejs/plugin-vue-jsx@^1.1.3": 243 | version "1.1.3" 244 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-1.1.3.tgz#426c68f8a367a603acb82fca6e2b12506ba9fc8e" 245 | integrity sha512-R9wsuNDEKTDG5oXJaFictrw9E5uokniGzi6tvyO5Od02tE4TnOPfgY2BeHKB4f4ldgiZRMhdUhNEsgjoWnct6A== 246 | dependencies: 247 | "@babel/core" "^7.12.10" 248 | "@babel/plugin-syntax-import-meta" "^7.10.4" 249 | "@babel/plugin-transform-typescript" "^7.12.1" 250 | "@vue/babel-plugin-jsx" "^1.0.3" 251 | hash-sum "^2.0.0" 252 | 253 | "@vitejs/plugin-vue@^1.2.2": 254 | version "1.2.2" 255 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.2.2.tgz#b0038fc11b9099f4cd01fcbf0ee419adda417b52" 256 | integrity sha512-5BI2WFfs/Z0pAV4S/IQf1oH3bmFYlL5ATMBHgTt1Lf7hAnfpNd5oUAAs6hZPfk3QhvyUQgtk0rJBlabwNFcBJQ== 257 | 258 | "@vue/babel-helper-vue-transform-on@^1.0.2": 259 | version "1.0.2" 260 | resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" 261 | integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== 262 | 263 | "@vue/babel-plugin-jsx@^1.0.3": 264 | version "1.0.5" 265 | resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.5.tgz#72820d5fb371c41d2113b31b16787995e8bdf69a" 266 | integrity sha512-Jtipy7oI0am5e1q5Ahunm/cCcCh5ssf5VkMQsLR383S3un5Qh7NBfxgSK9kmWf4IXJEhDeYp9kHv8G/EnMai9A== 267 | dependencies: 268 | "@babel/helper-module-imports" "^7.0.0" 269 | "@babel/plugin-syntax-jsx" "^7.0.0" 270 | "@babel/template" "^7.0.0" 271 | "@babel/traverse" "^7.0.0" 272 | "@babel/types" "^7.0.0" 273 | "@vue/babel-helper-vue-transform-on" "^1.0.2" 274 | camelcase "^6.0.0" 275 | html-tags "^3.1.0" 276 | svg-tags "^1.0.0" 277 | 278 | "@vue/compiler-core@3.0.11": 279 | version "3.0.11" 280 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.0.11.tgz#5ef579e46d7b336b8735228758d1c2c505aae69a" 281 | integrity sha512-6sFj6TBac1y2cWCvYCA8YzHJEbsVkX7zdRs/3yK/n1ilvRqcn983XvpBbnN3v4mZ1UiQycTvOiajJmOgN9EVgw== 282 | dependencies: 283 | "@babel/parser" "^7.12.0" 284 | "@babel/types" "^7.12.0" 285 | "@vue/shared" "3.0.11" 286 | estree-walker "^2.0.1" 287 | source-map "^0.6.1" 288 | 289 | "@vue/compiler-dom@3.0.11": 290 | version "3.0.11" 291 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.0.11.tgz#b15fc1c909371fd671746020ba55b5dab4a730ee" 292 | integrity sha512-+3xB50uGeY5Fv9eMKVJs2WSRULfgwaTJsy23OIltKgMrynnIj8hTYY2UL97HCoz78aDw1VDXdrBQ4qepWjnQcw== 293 | dependencies: 294 | "@vue/compiler-core" "3.0.11" 295 | "@vue/shared" "3.0.11" 296 | 297 | "@vue/compiler-sfc@^3.0.11": 298 | version "3.0.11" 299 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.0.11.tgz#cd8ca2154b88967b521f5ad3b10f5f8b6b665679" 300 | integrity sha512-7fNiZuCecRleiyVGUWNa6pn8fB2fnuJU+3AGjbjl7r1P5wBivfl02H4pG+2aJP5gh2u+0wXov1W38tfWOphsXw== 301 | dependencies: 302 | "@babel/parser" "^7.13.9" 303 | "@babel/types" "^7.13.0" 304 | "@vue/compiler-core" "3.0.11" 305 | "@vue/compiler-dom" "3.0.11" 306 | "@vue/compiler-ssr" "3.0.11" 307 | "@vue/shared" "3.0.11" 308 | consolidate "^0.16.0" 309 | estree-walker "^2.0.1" 310 | hash-sum "^2.0.0" 311 | lru-cache "^5.1.1" 312 | magic-string "^0.25.7" 313 | merge-source-map "^1.1.0" 314 | postcss "^8.1.10" 315 | postcss-modules "^4.0.0" 316 | postcss-selector-parser "^6.0.4" 317 | source-map "^0.6.1" 318 | 319 | "@vue/compiler-ssr@3.0.11": 320 | version "3.0.11" 321 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.0.11.tgz#ac5a05fd1257412fa66079c823d8203b6a889a13" 322 | integrity sha512-66yUGI8SGOpNvOcrQybRIhl2M03PJ+OrDPm78i7tvVln86MHTKhM3ERbALK26F7tXl0RkjX4sZpucCpiKs3MnA== 323 | dependencies: 324 | "@vue/compiler-dom" "3.0.11" 325 | "@vue/shared" "3.0.11" 326 | 327 | "@vue/shared@3.0.11": 328 | version "3.0.11" 329 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.11.tgz#20d22dd0da7d358bb21c17f9bde8628152642c77" 330 | integrity sha512-b+zB8A2so8eCE0JsxjL24J7vdGl8rzPQ09hZNhystm+KqSbKcAej1A+Hbva1rCMmTTqA+hFnUSDc5kouEo0JzA== 331 | 332 | ansi-styles@^3.2.1: 333 | version "3.2.1" 334 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 335 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 336 | dependencies: 337 | color-convert "^1.9.0" 338 | 339 | big.js@^5.2.2: 340 | version "5.2.2" 341 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 342 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 343 | 344 | bluebird@^3.7.2: 345 | version "3.7.2" 346 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 347 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 348 | 349 | browserslist@^4.14.5: 350 | version "4.16.5" 351 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" 352 | integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== 353 | dependencies: 354 | caniuse-lite "^1.0.30001214" 355 | colorette "^1.2.2" 356 | electron-to-chromium "^1.3.719" 357 | escalade "^3.1.1" 358 | node-releases "^1.1.71" 359 | 360 | camelcase@^6.0.0: 361 | version "6.2.0" 362 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" 363 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 364 | 365 | caniuse-lite@^1.0.30001214: 366 | version "1.0.30001219" 367 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001219.tgz#5bfa5d0519f41f993618bd318f606a4c4c16156b" 368 | integrity sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ== 369 | 370 | chalk@^2.0.0: 371 | version "2.4.2" 372 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 373 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 374 | dependencies: 375 | ansi-styles "^3.2.1" 376 | escape-string-regexp "^1.0.5" 377 | supports-color "^5.3.0" 378 | 379 | color-convert@^1.9.0: 380 | version "1.9.3" 381 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 382 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 383 | dependencies: 384 | color-name "1.1.3" 385 | 386 | color-name@1.1.3: 387 | version "1.1.3" 388 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 389 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 390 | 391 | colorette@^1.2.2: 392 | version "1.2.2" 393 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" 394 | integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 395 | 396 | consolidate@^0.16.0: 397 | version "0.16.0" 398 | resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" 399 | integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== 400 | dependencies: 401 | bluebird "^3.7.2" 402 | 403 | convert-source-map@^1.7.0: 404 | version "1.7.0" 405 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 406 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== 407 | dependencies: 408 | safe-buffer "~5.1.1" 409 | 410 | cssesc@^3.0.0: 411 | version "3.0.0" 412 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 413 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 414 | 415 | debug@^4.1.0: 416 | version "4.3.1" 417 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 418 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 419 | dependencies: 420 | ms "2.1.2" 421 | 422 | electron-to-chromium@^1.3.719: 423 | version "1.3.723" 424 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz#52769a75635342a4db29af5f1e40bd3dad02c877" 425 | integrity sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg== 426 | 427 | emojis-list@^3.0.0: 428 | version "3.0.0" 429 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 430 | integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== 431 | 432 | esbuild@^0.9.3: 433 | version "0.9.7" 434 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.9.7.tgz#ea0d639cbe4b88ec25fbed4d6ff00c8d788ef70b" 435 | integrity sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg== 436 | 437 | escalade@^3.1.1: 438 | version "3.1.1" 439 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 440 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 441 | 442 | escape-string-regexp@^1.0.5: 443 | version "1.0.5" 444 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 445 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 446 | 447 | estree-walker@^2.0.1: 448 | version "2.0.2" 449 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 450 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 451 | 452 | fsevents@~2.3.1: 453 | version "2.3.2" 454 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 455 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 456 | 457 | function-bind@^1.1.1: 458 | version "1.1.1" 459 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 460 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 461 | 462 | generic-names@^2.0.1: 463 | version "2.0.1" 464 | resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" 465 | integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== 466 | dependencies: 467 | loader-utils "^1.1.0" 468 | 469 | gensync@^1.0.0-beta.2: 470 | version "1.0.0-beta.2" 471 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 472 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 473 | 474 | globals@^11.1.0: 475 | version "11.12.0" 476 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 477 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 478 | 479 | has-flag@^3.0.0: 480 | version "3.0.0" 481 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 482 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 483 | 484 | has@^1.0.3: 485 | version "1.0.3" 486 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 487 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 488 | dependencies: 489 | function-bind "^1.1.1" 490 | 491 | hash-sum@^2.0.0: 492 | version "2.0.0" 493 | resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" 494 | integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== 495 | 496 | html-tags@^3.1.0: 497 | version "3.1.0" 498 | resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" 499 | integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== 500 | 501 | icss-replace-symbols@^1.1.0: 502 | version "1.1.0" 503 | resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 504 | integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= 505 | 506 | icss-utils@^5.0.0: 507 | version "5.1.0" 508 | resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" 509 | integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== 510 | 511 | is-core-module@^2.2.0: 512 | version "2.3.0" 513 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" 514 | integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== 515 | dependencies: 516 | has "^1.0.3" 517 | 518 | js-tokens@^4.0.0: 519 | version "4.0.0" 520 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 521 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 522 | 523 | jsesc@^2.5.1: 524 | version "2.5.2" 525 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 526 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 527 | 528 | json5@^1.0.1: 529 | version "1.0.1" 530 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 531 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 532 | dependencies: 533 | minimist "^1.2.0" 534 | 535 | json5@^2.1.2: 536 | version "2.2.0" 537 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" 538 | integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== 539 | dependencies: 540 | minimist "^1.2.5" 541 | 542 | loader-utils@^1.1.0: 543 | version "1.4.0" 544 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" 545 | integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== 546 | dependencies: 547 | big.js "^5.2.2" 548 | emojis-list "^3.0.0" 549 | json5 "^1.0.1" 550 | 551 | lodash.camelcase@^4.3.0: 552 | version "4.3.0" 553 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 554 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 555 | 556 | lru-cache@^5.1.1: 557 | version "5.1.1" 558 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 559 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 560 | dependencies: 561 | yallist "^3.0.2" 562 | 563 | magic-string@^0.25.7: 564 | version "0.25.7" 565 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 566 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 567 | dependencies: 568 | sourcemap-codec "^1.4.4" 569 | 570 | merge-source-map@^1.1.0: 571 | version "1.1.0" 572 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" 573 | integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== 574 | dependencies: 575 | source-map "^0.6.1" 576 | 577 | minimist@^1.2.0, minimist@^1.2.5: 578 | version "1.2.5" 579 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 580 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 581 | 582 | ms@2.1.2: 583 | version "2.1.2" 584 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 585 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 586 | 587 | nanoid@^3.1.22: 588 | version "3.1.22" 589 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" 590 | integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== 591 | 592 | node-releases@^1.1.71: 593 | version "1.1.71" 594 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" 595 | integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== 596 | 597 | path-parse@^1.0.6: 598 | version "1.0.6" 599 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 600 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 601 | 602 | postcss-modules-extract-imports@^3.0.0: 603 | version "3.0.0" 604 | resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" 605 | integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== 606 | 607 | postcss-modules-local-by-default@^4.0.0: 608 | version "4.0.0" 609 | resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" 610 | integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== 611 | dependencies: 612 | icss-utils "^5.0.0" 613 | postcss-selector-parser "^6.0.2" 614 | postcss-value-parser "^4.1.0" 615 | 616 | postcss-modules-scope@^3.0.0: 617 | version "3.0.0" 618 | resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" 619 | integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== 620 | dependencies: 621 | postcss-selector-parser "^6.0.4" 622 | 623 | postcss-modules-values@^4.0.0: 624 | version "4.0.0" 625 | resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" 626 | integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== 627 | dependencies: 628 | icss-utils "^5.0.0" 629 | 630 | postcss-modules@^4.0.0: 631 | version "4.0.0" 632 | resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.0.0.tgz#2bc7f276ab88f3f1b0fadf6cbd7772d43b5f3b9b" 633 | integrity sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw== 634 | dependencies: 635 | generic-names "^2.0.1" 636 | icss-replace-symbols "^1.1.0" 637 | lodash.camelcase "^4.3.0" 638 | postcss-modules-extract-imports "^3.0.0" 639 | postcss-modules-local-by-default "^4.0.0" 640 | postcss-modules-scope "^3.0.0" 641 | postcss-modules-values "^4.0.0" 642 | string-hash "^1.1.1" 643 | 644 | postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: 645 | version "6.0.5" 646 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz#042d74e137db83e6f294712096cb413f5aa612c4" 647 | integrity sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg== 648 | dependencies: 649 | cssesc "^3.0.0" 650 | util-deprecate "^1.0.2" 651 | 652 | postcss-value-parser@^4.1.0: 653 | version "4.1.0" 654 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" 655 | integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== 656 | 657 | postcss@^8.1.10, postcss@^8.2.1: 658 | version "8.2.13" 659 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.13.tgz#dbe043e26e3c068e45113b1ed6375d2d37e2129f" 660 | integrity sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ== 661 | dependencies: 662 | colorette "^1.2.2" 663 | nanoid "^3.1.22" 664 | source-map "^0.6.1" 665 | 666 | resolve@^1.19.0: 667 | version "1.20.0" 668 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 669 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 670 | dependencies: 671 | is-core-module "^2.2.0" 672 | path-parse "^1.0.6" 673 | 674 | rollup@^2.38.5: 675 | version "2.45.2" 676 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" 677 | integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== 678 | optionalDependencies: 679 | fsevents "~2.3.1" 680 | 681 | safe-buffer@~5.1.1: 682 | version "5.1.2" 683 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 684 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 685 | 686 | semver@^6.3.0: 687 | version "6.3.0" 688 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 689 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 690 | 691 | source-map@^0.5.0: 692 | version "0.5.7" 693 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 694 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 695 | 696 | source-map@^0.6.1: 697 | version "0.6.1" 698 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 699 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 700 | 701 | sourcemap-codec@^1.4.4: 702 | version "1.4.8" 703 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 704 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 705 | 706 | string-hash@^1.1.1: 707 | version "1.1.3" 708 | resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" 709 | integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= 710 | 711 | supports-color@^5.3.0: 712 | version "5.5.0" 713 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 714 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 715 | dependencies: 716 | has-flag "^3.0.0" 717 | 718 | svg-tags@^1.0.0: 719 | version "1.0.0" 720 | resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" 721 | integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= 722 | 723 | to-fast-properties@^2.0.0: 724 | version "2.0.0" 725 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 726 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 727 | 728 | util-deprecate@^1.0.2: 729 | version "1.0.2" 730 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 731 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 732 | 733 | vite@^2.2.3: 734 | version "2.2.3" 735 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.2.3.tgz#1acbdfa56ac00e00e7ccb6988f63f130c2f99dbb" 736 | integrity sha512-PtjyBL4GtACM+uT5q5hi2+AlMBbb6YI2b2bam6QI8ZdZt4FezseF0yZHQx0G+b3po9jIJ/GS5N9gc5Yq9Rue7g== 737 | dependencies: 738 | esbuild "^0.9.3" 739 | postcss "^8.2.1" 740 | resolve "^1.19.0" 741 | rollup "^2.38.5" 742 | optionalDependencies: 743 | fsevents "~2.3.1" 744 | 745 | yallist@^3.0.2: 746 | version "3.1.1" 747 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 748 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 749 | --------------------------------------------------------------------------------