added MD file support and popup for it

This commit is contained in:
Elvanos 2023-10-25 23:44:28 +02:00
parent 8320a73f75
commit 91bba8c1eb
11 changed files with 175 additions and 308 deletions

View file

@ -1 +1 @@
export type T_documentList = 'advancedSearchCheatSheet'| 'advancedSearchGuide'| 'changeLog'| 'license'
export type T_documentList = 'advancedSearchCheatSheet'| 'advancedSearchGuide'| 'changeLog'| 'license' | 'test' | ''

View file

@ -19,6 +19,7 @@
"@quasar/extras": "^1.16.4",
"app-root-path": "^3.1.0",
"axios": "^1.2.1",
"lodash-es": "^4.17.21",
"pinia": "^2.0.11",
"quasar": "^2.6.0",
"sqlite3": "^5.1.6",
@ -29,11 +30,13 @@
},
"devDependencies": {
"@intlify/vite-plugin-vue-i18n": "^3.3.1",
"@pinia/testing": "^0.1.3",
"@playwright/test": "^1.37.1",
"@quasar/app-vite": "^1.3.0",
"@quasar/quasar-app-extension-qmarkdown": "^2.0.0-beta.10",
"@quasar/quasar-app-extension-testing": "^2.1.0",
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.1.0",
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
"@types/lodash-es": "^4.17.10",
"@types/node": "^16.18.0",
"@types/uuid": "^9.0.5",
"@typescript-eslint/eslint-plugin": "^5.10.0",

View file

@ -3,7 +3,7 @@ import appRoot from 'app-root-path'
export const extraEnvVariablesAPI: I_extraEnvVariablesAPI = {
ELECTRON_MAIN_FILEPATH: appRoot + '/dist/electron/UnPackaged/electron-main.js',
FA_FRONTEND_RENDER_TIMER: 1000,
FA_FRONTEND_RENDER_TIMER: 3000,
TEST_ENV: (process.env.TEST_ENV) ? process.env.TEST_ENV : false,
COMPONENT_NAME: (process.env.COMPONENT_NAME) ? process.env.COMPONENT_NAME : false,
COMPONENT_PROPS: (process.env.COMPONENT_PROPS) ? JSON.parse(process.env.COMPONENT_PROPS) : false

View file

@ -106,13 +106,32 @@
<script setup lang="ts">
import { I_appMenusDataList } from 'app/interfaces/I_appMenusDataList'
/**
* All component props
*/
const props = defineProps<{
/**
* Data input for the component
*/
dataInput: I_appMenusDataList
}>()
const hasProperDataInput = (props.dataInput.title && props.dataInput.data)
/**
* Determines if the input has "proper" data in it
* Checks for:
* - Title
* - Overall data feed
*/
const hasProperDataInput = !!(props.dataInput.title && props.dataInput.data)
/**
* Menu title from the prop
*/
const menuTitle = props.dataInput.title
/**
* Menu data content from the prop
*/
const menuData = props.dataInput.data
</script>

View file

@ -1,6 +1,7 @@
import { _electron as electron } from 'playwright'
import { test, expect } from '@playwright/test'
import { extraEnvVariablesAPI } from 'app/src-electron/customContentBridgeAPIs/extraEnvVariablesAPI'
import { T_documentList } from 'app/interfaces/T_documentList'
/**
* Extra env settings to trigger component testing via Playwright
@ -20,22 +21,24 @@ const electronMainFilePath:string = extraEnvVariablesAPI.ELECTRON_MAIN_FILEPATH
* Extra rended timer buffer for tests to start after loading the app
* - Change here in order manually adjust this component's wait times
*/
const faFrontendRenderTimer:number = extraEnvVariablesAPI.FA_FRONTEND_RENDER_TIMER
const faFrontendRenderTimer = extraEnvVariablesAPI.FA_FRONTEND_RENDER_TIMER
/**
* Object of string data selectors for the component
*/
const selectorList = {
image: 'fantasiaMascotImage-image'
markdownWrapper: 'dialogMarkdownDocument-markdown-wrapper',
markdownContent: 'dialogMarkdownDocument-markdown-content',
closeButton: 'dialogMarkdownDocument-button-close'
}
/**
* Attempt to pass "width" prop to the component and check the result
* Feed 'license' input as the file to open and check if the opened dialog afterwars has all the needed elements in it
*/
test('Visually check "width" prop', async () => {
const testString = '300px'
test('Open test "license" dialog with all elements in it', async () => {
const testString: T_documentList = 'license'
extraEnvSettings.COMPONENT_PROPS = JSON.stringify({ width: testString })
extraEnvSettings.COMPONENT_PROPS = JSON.stringify({ directInput: testString })
const electronApp = await electron.launch({
env: extraEnvSettings,
@ -45,37 +48,26 @@ test('Visually check "width" prop', async () => {
const appWindow = await electronApp.firstWindow()
await appWindow.waitForTimeout(faFrontendRenderTimer)
const imageElement = await appWindow.$(`[data-test="${selectorList.image}"]`)
const closeButton = await appWindow.$(`[data-test="${selectorList.closeButton}"]`)
const markdownWrapper = await appWindow.$(`[data-test="${selectorList.markdownWrapper}"]`)
const markdownContent = await appWindow.$(`[data-test="${selectorList.markdownContent}"]`)
// Check if the tested element exists
if (imageElement !== null) {
const imageBoxData = await imageElement.boundingBox()
// Test if the tested element isn't invisisble for some reason
if (imageBoxData !== null) {
const roundedFirstValue = Math.round(imageBoxData.width)
const roundedSecondValue = Math.round(parseInt(testString))
expect(roundedFirstValue).toBe(roundedSecondValue)
} else {
// Element is invisible
test.fail()
}
// Check if the tested elements exists
if (closeButton !== null && markdownWrapper !== null && markdownContent !== null) {
expect(true).toBe(true)
} else {
// Element doesn't exist
// Elements don't exist
test.fail()
}
await electronApp.close()
})
/**
* Attempt to pass "height" prop to the component and check the result
* Feed 'license' input as the file to open and check if the opened dialog afterwars has all the needed elements in it
*/
test('Visually check "height" prop', async () => {
const testString = '300px'
test('Open test "license" dialog and try closing it', async () => {
const testString: T_documentList = 'license'
extraEnvSettings.COMPONENT_PROPS = JSON.stringify({ height: testString })
extraEnvSettings.COMPONENT_PROPS = JSON.stringify({ directInput: testString })
const electronApp = await electron.launch({
env: extraEnvSettings,
@ -85,26 +77,18 @@ test('Visually check "height" prop', async () => {
const appWindow = await electronApp.firstWindow()
await appWindow.waitForTimeout(faFrontendRenderTimer)
const imageElement = await appWindow.$(`[data-test="${selectorList.image}"]`)
const closeButton = await appWindow.$(`[data-test="${selectorList.closeButton}"]`)
const markdownContent = await appWindow.$(`[data-test="${selectorList.markdownContent}"]`)
// Check if the tested element exists
if (imageElement !== null) {
const imageBoxData = await imageElement.boundingBox()
// Check if the close button exists
if (closeButton !== null && markdownContent !== null) {
await closeButton.click()
await appWindow.waitForTimeout(1500)
// Test if the tested element isn't invisisble for some reason
if (imageBoxData !== null) {
const roundedFirstValue = Math.round(imageBoxData.height)
const roundedSecondValue = Math.round(parseInt(testString))
expect(roundedFirstValue).toBe(roundedSecondValue)
} else {
// Element is invisible
test.fail()
}
// Check if the content is properly hidden after closing the popup
expect(await markdownContent.isHidden()).toBe(true)
} else {
// Element doesn't exist
// Close button doesn't exist
test.fail()
}
await electronApp.close()
})

View file

@ -1,90 +1,19 @@
import { installQuasar } from '@quasar/quasar-app-extension-testing-unit-vitest'
import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'
import FantasiaMascotImage from './DialogMarkdownDocument.vue'
installQuasar()
import { describe, it } from 'vitest'
describe('Component - "DialogMarkdownDocument"', () => {
/**
* Object of string data selectors for the component
*/
/*
const selectorList = {
image: 'fantasiaMascotImage-image'
}
markdown: 'dialogMarkdownDocument-markdown',
markdownWrapper: 'dialogMarkdownDocument-markdown-wrappers',
closeButton: 'dialogMarkdownDocument-button-close'
} */
/**
* Test if the component has an "img" HTML element properly mounted in it.
* Placeholder test due to incompatibility of unit vitest incompatibility with something in this component
* Actual testing moved to component tests
*/
it('Wrapper should contain an image', () => {
const wrapper = mount(FantasiaMascotImage)
const imageElement = wrapper.get(`[data-test="${selectorList.image}"]`).element
expect(imageElement.tagName).toBe('IMG')
})
/**
* Test if the "img" HTML element has received the "width" prop properly.
* - Testing via "dataset" instead of actual width due to Vitest limitations.
*/
it('Image inside wrapper should have 300px "width"', () => {
const testString = '300px'
const wrapper = mount(FantasiaMascotImage, {
propsData: {
width: testString
}
})
const imageElement = wrapper.get(`[data-test="${selectorList.image}"]`).element as HTMLImageElement
expect(imageElement.dataset.testWidth).toBe(testString)
})
/**
* Test if the "img" HTML element has received the "height" prop properly.
* - Testing via "dataset" instead of actual height due to Vitest limitations.
*/
it('Image inside wrapper should have 300px "height"', () => {
const testString = '300px'
const wrapper = mount(FantasiaMascotImage, {
propsData: {
height: testString
}
})
const imageElement = wrapper.get(`[data-test="${selectorList.image}"]`).element as HTMLImageElement
expect(imageElement.dataset.testHeight).toBe(testString)
})
/**
* Test if the component properly determines if the image will be random.
*/
it('Should generate random image URL', () => {
const wrapper = mount(FantasiaMascotImage)
const imageElement = wrapper.get(`[data-test="${selectorList.image}"]`).element as HTMLImageElement
expect(imageElement.dataset.testIsRandom).toBe('true')
})
/**
* Test if the component properly determines if the image will NOT be random.
*/
it('Should generate non-random image URL', () => {
const testString = 'flop'
const wrapper = mount(FantasiaMascotImage, {
propsData: {
fantasiaImage: testString
}
})
const imageElement = wrapper.get(`[data-test="${selectorList.image}"]`).element as HTMLImageElement
expect(imageElement.dataset.testIsRandom).toBe('false')
})
it('Placeholder - Test runs! :o')
})

View file

@ -5,24 +5,34 @@
:class="['dialogMarkdownDocument', `${documentName}`]"
>
<q-card>
<!-- Dialog contents wrapper -->
<q-card-section :class="['dialogMarkdownDocument__content', `${documentName}`, 'q-mt-xl', 'q-mb-lg', 'q-mr-lg', 'q-ml-xl', 'q-pt-none']">
<div class="flex justify-center">
<div
class="flex justify-center"
data-test="dialogMarkdownDocument-markdown-wrapper"
>
<!-- Dialog markdown -->
<q-markdown
no-heading-anchor-links
data-test="dialogMarkdownDocument-markdown-content"
:class="[`${documentName}`, 'dialogMarkdownDocument']"
:src="$t(`documents.${documentName}`)"
/>
</div>
</q-card-section>
<!-- Card actions wrapper -->
<q-card-actions
align="around"
class="q-mb-lg"
>
<!-- Close button -->
<q-btn
v-close-popup
flat
label="Close"
color="accent"
data-test="dialogMarkdownDocument-button-close"
/>
</q-card-actions>
</q-card>
@ -32,20 +42,62 @@
<script setup lang="ts">
import { QMarkdown } from '@quasar/quasar-ui-qmarkdown'
import '@quasar/quasar-ui-qmarkdown/dist/index.css'
import { T_documentList } from 'app/interfaces/T_documentList'
import { S_DialogMarkdown } from 'src/stores/S_DialogMarkdown'
import { onMounted, ref, watch } from 'vue'
import { ref, watch } from 'vue'
/**
* All component props
*/
const props = defineProps<{
/**
* Custom input directly fed to the component in case it doesn't get triggered from the global store
*/
directInput: T_documentList
}>()
/**
* Model for the current popup dialog
*/
const dialogModel = ref(false)
/**
* Name of the document shown inside the dialog
*/
const documentName = ref('')
const openDialog = () => {
documentName.value = S_DialogMarkdown.documentToOpen
/**
* Opens the popup dialog via direct input-feed
*/
const openDialog = (input: T_documentList) => {
documentName.value = input
dialogModel.value = true
}
/**
* Trigger dialog popup via reaction to store update
*/
watch(() => S_DialogMarkdown.dialogUUID, () => {
openDialog()
openDialog(S_DialogMarkdown.documentToOpen)
})
/**
* Trigger dialog popup via reaction to direct prop feed
*/
watch(() => props.directInput, () => {
if (props.directInput !== undefined && props.directInput !== '') {
openDialog(props.directInput)
}
})
/**
* Checks the prop feed-status on the first mount and open the dialog if the prop is properly fed in
* This exist mostly due to component tests being flaky otherwise
*/
onMounted(() => {
if (props.directInput !== undefined && props.directInput !== '') {
openDialog(props.directInput)
}
})
</script>

View file

@ -1,9 +1,9 @@
import { installQuasar } from '@quasar/quasar-app-extension-testing-unit-vitest'
import { installQuasarPlugin } from '@quasar/quasar-app-extension-testing-unit-vitest'
import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'
import FantasiaMascotImage from './FantasiaMascotImage.vue'
installQuasar()
installQuasarPlugin()
describe('Component - "FantasiaMascotImage"', () => {
/**

View file

@ -101,8 +101,7 @@ const currentMascotImage = determineCurrentImage(fantasiaImageList)
<style lang="scss" scoped>
.fantasiaMascotImage {
&__inner{
&__inner {
height: v-bind(height);
width: v-bind(width);
user-select: none;

View file

@ -1,9 +1,9 @@
import { installQuasar } from '@quasar/quasar-app-extension-testing-unit-vitest'
import { installQuasarPlugin } from '@quasar/quasar-app-extension-testing-unit-vitest'
import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'
import GlobalWindowButtons from './GlobalWindowButtons.vue'
installQuasar()
installQuasarPlugin()
describe('Component - "GlobalWindowButtons"', () => {
/**

217
yarn.lock
View file

@ -363,6 +363,13 @@
resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz"
integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
"@pinia/testing@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@pinia/testing/-/testing-0.1.3.tgz#ee46a5a51d437f845ddc9c7b048c98b6a435e68b"
integrity sha512-D2Ds2s69kKFaRf2KCcP1NhNZEg5+we59aRyQalwRm7ygWfLM25nDH66267U3hNvRUOTx8ofL24GzodZkOmB5xw==
dependencies:
vue-demi ">=0.14.5"
"@playwright/test@^1.37.1":
version "1.37.1"
resolved "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz"
@ -442,15 +449,15 @@
raw-loader "^4.0.2"
webpack-merge "^5.8.0"
"@quasar/quasar-app-extension-testing-unit-vitest@^0.1.0":
version "0.1.2"
resolved "https://registry.npmjs.org/@quasar/quasar-app-extension-testing-unit-vitest/-/quasar-app-extension-testing-unit-vitest-0.1.2.tgz"
integrity sha512-yqpXu0J8Gttr00UCzEAMptZX8aggqsiG14cgeKLt0Hm3pU9PtwXqjX/EYifgQyldw0b7LbAzpdHhsXU2BU9vpA==
"@quasar/quasar-app-extension-testing-unit-vitest@^0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@quasar/quasar-app-extension-testing-unit-vitest/-/quasar-app-extension-testing-unit-vitest-0.4.0.tgz#d5cb651ac2f17154de6f9499f5205c9632490ad2"
integrity sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==
dependencies:
happy-dom "^5.0.0"
happy-dom "^11.0.6"
lodash-es "^4.17.21"
vite-jsconfig-paths "^2.0.1"
vite-tsconfig-paths "^3.5.0"
vite-tsconfig-paths "^4.2.1"
"@quasar/quasar-app-extension-testing@^2.1.0":
version "2.1.1"
@ -560,13 +567,6 @@
dependencies:
"@types/express" "*"
"@types/concat-stream@^1.6.0":
version "1.6.1"
resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz"
integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==
dependencies:
"@types/node" "*"
"@types/connect@*":
version "3.4.35"
resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz"
@ -618,13 +618,6 @@
resolved "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz"
integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
"@types/form-data@0.0.33":
version "0.0.33"
resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz"
integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==
dependencies:
"@types/node" "*"
"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11":
version "9.0.13"
resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz"
@ -674,6 +667,18 @@
resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b"
integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==
"@types/lodash-es@^4.17.10":
version "4.17.10"
resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.10.tgz#1b36a76ca9eda20c0263e19bbe1a3adb1b317707"
integrity sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==
dependencies:
"@types/lodash" "*"
"@types/lodash@*":
version "4.14.200"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149"
integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==
"@types/markdown-it@^12.2.3":
version "12.2.3"
resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51"
@ -712,11 +717,6 @@
resolved "https://registry.npmjs.org/@types/node/-/node-20.5.8.tgz"
integrity sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==
"@types/node@^10.0.3":
version "10.17.60"
resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz"
integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
"@types/node@^16.18.0":
version "16.18.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.0.tgz#34982c6d5b5734c900f4ee69e1b87d212db6c60f"
@ -727,11 +727,6 @@
resolved "https://registry.npmjs.org/@types/node/-/node-18.17.13.tgz"
integrity sha512-SlLPDDe6YQl1JnQQy4hgsuJeo5q5c1TBU4be4jeBLXsqpjoDbfb0HesSfhMwnaxfSJ4txtfzJzW5/x/43fkkfQ==
"@types/node@^8.0.0":
version "8.10.66"
resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz"
integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==
"@types/normalize-package-data@^2.4.0":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca"
@ -745,7 +740,7 @@
"@types/node" "*"
xmlbuilder ">=11.0.1"
"@types/qs@*", "@types/qs@^6.2.31":
"@types/qs@*":
version "6.9.8"
resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz"
integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==
@ -1307,11 +1302,6 @@ arrify@^1.0.1:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
asap@~2.0.6:
version "2.0.6"
resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
@ -1632,11 +1622,6 @@ caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520:
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz"
integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==
caseless@^0.12.0, caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
chai@^4.3.6:
version "4.3.8"
resolved "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz"
@ -1813,7 +1798,7 @@ colord@^2.9.3:
resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
combined-stream@^1.0.6, combined-stream@^1.0.8:
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@ -1880,16 +1865,6 @@ concat-map@0.0.1:
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
concat-stream@^1.6.0, concat-stream@^1.6.2:
version "1.6.2"
resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
dependencies:
buffer-from "^1.0.0"
inherits "^2.0.3"
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-chain@^1.1.13:
version "1.1.13"
resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz"
@ -2357,7 +2332,7 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
entities@^4.2.0, entities@^4.4.0:
entities@^4.2.0, entities@^4.4.0, entities@^4.5.0:
version "4.5.0"
resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@ -3174,15 +3149,6 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
form-data@^2.2.0:
version "2.5.1"
resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz"
integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz"
@ -3347,11 +3313,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@
has-proto "^1.0.1"
has-symbols "^1.0.3"
get-port@^3.1.0:
version "3.2.0"
resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz"
integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
@ -3524,15 +3485,14 @@ graphemer@^1.4.0:
resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
happy-dom@^5.0.0:
version "5.4.0"
resolved "https://registry.npmjs.org/happy-dom/-/happy-dom-5.4.0.tgz"
integrity sha512-JxXpBvEUdyCqfRHzHJKtiJ+6+WzTIL6kFCteAOEy13QEnHMD/D5uUIVVw3a4TmQroJriz0gnll4Uv1qZeSz/rA==
happy-dom@^11.0.6:
version "11.2.0"
resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-11.2.0.tgz#4b476deb71707bc7c231e6545cd62a81ef2cf689"
integrity sha512-z4PshcYIIH6SkymSNRcDFwYUJOENe+FOQDx5BbHgg/wQUgxF5p9I9/BN45Jff34bbhXV8yJgkC5N99eyOzXK3w==
dependencies:
css.escape "^1.5.1"
he "^1.2.0"
node-fetch "^2.x.x"
sync-request "^6.1.0"
entities "^4.5.0"
iconv-lite "^0.6.3"
webidl-conversions "^7.0.0"
whatwg-encoding "^2.0.0"
whatwg-mimetype "^3.0.0"
@ -3640,16 +3600,6 @@ htmlparser2@^8.0.0:
domutils "^3.0.1"
entities "^4.4.0"
http-basic@^8.1.1:
version "8.1.3"
resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz"
integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==
dependencies:
caseless "^0.12.0"
concat-stream "^1.6.2"
http-response-object "^3.0.1"
parse-cache-control "^1.0.1"
http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
version "4.1.1"
resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz"
@ -3684,13 +3634,6 @@ http-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
http-response-object@^3.0.1:
version "3.0.2"
resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz"
integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==
dependencies:
"@types/node" "^10.0.3"
http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz"
@ -3734,7 +3677,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@0.6.3, iconv-lite@^0.6.2:
iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@ -4191,7 +4134,7 @@ json5@^1.0.2:
dependencies:
minimist "^1.2.0"
json5@^2.1.2, json5@^2.2.0, json5@^2.2.2:
json5@^2.1.2, json5@^2.2.0:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@ -4300,7 +4243,7 @@ locate-path@^6.0.0:
lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash.defaults@^4.2.0:
@ -4780,7 +4723,7 @@ node-addon-api@^4.2.0:
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz"
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
node-fetch@^2.6.7, node-fetch@^2.x.x:
node-fetch@^2.6.7:
version "2.7.0"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
@ -5046,11 +4989,6 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
parse-cache-control@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz"
integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==
parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@ -5251,13 +5189,6 @@ promise-retry@^2.0.1:
err-code "^2.0.2"
retry "^0.12.0"
promise@^8.0.0:
version "8.3.0"
resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz"
integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==
dependencies:
asap "~2.0.6"
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
@ -5301,13 +5232,6 @@ qs@6.11.0:
dependencies:
side-channel "^1.0.4"
qs@^6.4.0:
version "6.11.2"
resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz"
integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
dependencies:
side-channel "^1.0.4"
quasar@^2.6.0:
version "2.12.5"
resolved "https://registry.npmjs.org/quasar/-/quasar-2.12.5.tgz"
@ -5389,7 +5313,7 @@ read-pkg@^6.0.0:
parse-json "^5.2.0"
type-fest "^1.0.1"
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2:
readable-stream@^2.0.0, readable-stream@^2.0.5:
version "2.3.8"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@ -6186,22 +6110,6 @@ symbol-tree@^3.2.4:
resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
sync-request@^6.1.0:
version "6.1.0"
resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz"
integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==
dependencies:
http-response-object "^3.0.1"
sync-rpc "^1.2.1"
then-request "^6.0.0"
sync-rpc@^1.2.1:
version "1.3.6"
resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz"
integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==
dependencies:
get-port "^3.1.0"
table@^6.8.0, table@^6.8.1:
version "6.8.1"
resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz"
@ -6249,23 +6157,6 @@ text-table@^0.2.0:
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
then-request@^6.0.0:
version "6.0.2"
resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz"
integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==
dependencies:
"@types/concat-stream" "^1.6.0"
"@types/form-data" "0.0.33"
"@types/node" "^8.0.0"
"@types/qs" "^6.2.31"
caseless "~0.12.0"
concat-stream "^1.6.0"
form-data "^2.2.0"
http-basic "^8.1.1"
http-response-object "^3.0.1"
promise "^8.0.0"
qs "^6.4.0"
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz"
@ -6372,6 +6263,11 @@ ts-interface-checker@^0.1.9:
resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz"
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
tsconfck@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-2.1.2.tgz#f667035874fa41d908c1fe4d765345fcb1df6e35"
integrity sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==
tsconfig-paths@^3.14.2, tsconfig-paths@^3.9.0:
version "3.14.2"
resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz"
@ -6382,15 +6278,6 @@ tsconfig-paths@^3.14.2, tsconfig-paths@^3.9.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
tsconfig-paths@^4.0.0:
version "4.2.0"
resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz"
integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==
dependencies:
json5 "^2.2.2"
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@^1.8.1, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
@ -6487,11 +6374,6 @@ typed-array-length@^1.0.4:
for-each "^0.3.3"
is-typed-array "^1.1.9"
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript@^4.0.2, typescript@^4.5.4:
version "4.9.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
@ -6643,15 +6525,14 @@ vite-jsconfig-paths@^2.0.1:
recrawl-sync "^2.0.3"
tsconfig-paths "^3.9.0"
vite-tsconfig-paths@^3.5.0:
version "3.6.0"
resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-3.6.0.tgz"
integrity sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==
vite-tsconfig-paths@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz#e53b89096b91d31a6d1e26f75999ea8c336a89ed"
integrity sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==
dependencies:
debug "^4.1.1"
globrex "^0.1.2"
recrawl-sync "^2.0.3"
tsconfig-paths "^4.0.0"
tsconfck "^2.1.0"
vite@^2.9.12, vite@^2.9.13:
version "2.9.16"