diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 162b32db..af91af2d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -6,9 +6,18 @@ module.exports = { 'plugin:@typescript-eslint/recommended', // 'plugin:@typescript-eslint/recommended-requiring-type-checking', 'plugin:@typescript-eslint/strict', + 'plugin:unicorn/recommended', 'prettier' ], - plugins: ['svelte3', 'tailwindcss', '@typescript-eslint', 'es', 'vitest', 'no-only-tests'], + plugins: [ + 'svelte3', + 'tailwindcss', + '@typescript-eslint', + 'es', + 'vitest', + 'no-only-tests', + 'unicorn' + ], ignorePatterns: [ 'docs/*', '*.cjs', @@ -59,6 +68,33 @@ module.exports = { '@typescript-eslint/no-unsafe-assignment': 'off', 'es/no-regexp-lookbehind-assertions': 'error', curly: ['error', 'all'], - 'no-only-tests/no-only-tests': 'error' + 'no-only-tests/no-only-tests': 'error', + 'unicorn/no-null': 'off', + 'unicorn/filename-case': [ + 'error', + { + case: 'camelCase' + } + ], + 'unicorn/prevent-abbreviations': [ + 'error', + { + allowList: { + ctx: true, + db: true, + doc: true, + env: true, + fn: true, + i: true, + param: true, + req: true, + res: true, + str: true, + searchParams: true, + temp: true, + ImportMetaEnv: true + } + } + ] } }; diff --git a/cypress/e2e/history.spec.ts b/cypress/e2e/history.spec.ts index af5305c9..6b2031e4 100644 --- a/cypress/e2e/history.spec.ts +++ b/cypress/e2e/history.spec.ts @@ -84,15 +84,15 @@ describe('Save History', () => { // TODO: Fix #639 xit('should auto save history', () => { getEditor().type(' C --> HistoryTest'); - cy.tick(70000); + cy.tick(70_000); cy.contains('Timeline').click(); cy.get('#historyList').find('li').should('have.length', 1); cy.get('#editor').type('ing'); - cy.tick(70000); + cy.tick(70_000); cy.get('#historyList').find('li').should('have.length', 2); for (let i = 0; i < 31; i++) { cy.get('#editor').type('.'); - cy.tick(70000); + cy.tick(70_000); } cy.get('#historyList').find('li').should('have.length', 30); }); diff --git a/cypress/e2e/util.ts b/cypress/e2e/util.ts index 6aa17ce5..1f53c7d7 100644 --- a/cypress/e2e/util.ts +++ b/cypress/e2e/util.ts @@ -37,7 +37,7 @@ export const verifyFileSnapshot = ( cy.readFile(filePath, null, { log: false }).then((buffer) => - expect(new TextDecoder('utf-8').decode(buffer as ArrayBuffer)).to.contain(content) + expect(new TextDecoder('utf8').decode(buffer as ArrayBuffer)).to.contain(content) ); cy.task('deleteFile', filePath); }; diff --git a/package.json b/package.json index 54f0953f..721562c1 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "eslint-plugin-postcss-modules": "2.0.0", "eslint-plugin-svelte3": "4.0.0", "eslint-plugin-tailwindcss": "3.7.0", + "eslint-plugin-unicorn": "^45.0.0", "eslint-plugin-vitest": "^0.0.20", "esserializer": "1.3.5", "font-awesome": "^4.7.0", diff --git a/src/lib/components/History/history.test.ts b/src/lib/components/History/history.test.ts index 482de012..ec669738 100644 --- a/src/lib/components/History/history.test.ts +++ b/src/lib/components/History/history.test.ts @@ -17,7 +17,7 @@ describe('history', () => { addHistoryEntry({ state: defaultState, - time: 12345, + time: 12_345, type: 'manual' }); @@ -25,14 +25,14 @@ describe('history', () => { window.localStorage.getItem('manualHistoryStore') ?? '[]' ) as HistoryEntry[]; - expect(manualEntry.time).toBe(12345); + expect(manualEntry.time).toBe(12_345); expect(manualEntry.type).toBe('manual'); expect(manualEntry.name).not.toBeNull(); expect(manualEntry.state).not.toBeNull(); addHistoryEntry({ state: defaultState, - time: 54321, + time: 54_321, type: 'auto' }); @@ -40,7 +40,7 @@ describe('history', () => { window.localStorage.getItem('autoHistoryStore') ?? '[]' ) as HistoryEntry[]; - expect(autoEntry.time).toBe(54321); + expect(autoEntry.time).toBe(54_321); expect(autoEntry.type).toBe('auto'); expect(autoEntry.name).not.toBeNull(); expect(autoEntry.state).not.toBeNull(); @@ -56,12 +56,12 @@ describe('history', () => { it('should clear history entries', () => { addHistoryEntry({ state: defaultState, - time: 12345, + time: 12_345, type: 'manual' }); addHistoryEntry({ state: { ...defaultState, code: 'graph TD\\n A[Christmas] -->|Get money| B(Go shopping)' }, - time: 123456, + time: 123_456, type: 'manual' }); @@ -76,12 +76,12 @@ describe('history', () => { historyModeStore.set('auto'); addHistoryEntry({ state: defaultState, - time: 54321, + time: 54_321, type: 'auto' }); addHistoryEntry({ state: { ...defaultState, code: 'graph TD\\n A[Christmas] -->|Get money| B(Go shopping)' }, - time: 654321, + time: 654_321, type: 'auto' }); expect(get(historyStore).length).toBe(2); diff --git a/src/lib/components/History/history.ts b/src/lib/components/History/history.ts index 20f19ba3..ce24c949 100644 --- a/src/lib/components/History/history.ts +++ b/src/lib/components/History/history.ts @@ -26,19 +26,27 @@ const manualHistoryStore: Writable = persist( 'manualHistoryStore' ); -export const loaderHistoryStore: Writable = writable([] as HistoryEntry[]); +export const loaderHistoryStore: Writable = writable([]); export const historyStore: Readable = derived( [historyModeStore, autoHistoryStore, manualHistoryStore, loaderHistoryStore], ([historyMode, autoHistories, manualHistories, loadedHistories], set) => { - if (historyMode === 'auto') { - set(autoHistories); - } else if (historyMode === 'manual') { - set(manualHistories); - } else if (historyMode === 'loader') { - set(loadedHistories); - } else { - set(autoHistories); + switch (historyMode) { + case 'auto': { + set(autoHistories); + break; + } + case 'manual': { + set(manualHistories); + break; + } + case 'loader': { + set(loadedHistories); + break; + } + default: { + set(autoHistories); + } } } ); @@ -90,7 +98,7 @@ export const getPreviousState = (auto: boolean): string => { }; export const restoreHistory = (data: HistoryEntry[]) => { - const entries = data.filter(validateEntry); + const entries = data.filter((element) => validateEntry(element)); const invalidEntryCount = data.length - entries.length; if (invalidEntryCount > 0) { console.error(`${invalidEntryCount} invalid history entries were removed.`); @@ -122,20 +130,23 @@ export const restoreHistory = (data: HistoryEntry[]) => { alert('No valid entries found.'); } }; +const setIDs = (entries: HistoryEntry[]) => { + for (const entry of entries) { + if (!entry.id) { + entry.id = uuidV4(); + } + } + return entries; +}; export const injectHistoryIDs = (): void => { - const setIDs = (entries: HistoryEntry[]) => { - for (const entry of entries) { - if (!entry.id) { - entry.id = uuidV4(); - } - } - return entries; - }; autoHistoryStore.update(setIDs); manualHistoryStore.update(setIDs); }; const validateEntry = (entry: HistoryEntry): boolean => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition return entry.type && entry.state && entry.time && true; }; diff --git a/src/lib/types.d.ts b/src/lib/types.d.ts index d4617890..6056a5f1 100644 --- a/src/lib/types.d.ts +++ b/src/lib/types.d.ts @@ -73,7 +73,7 @@ export type HistoryEntry = { id: string; state: State; time: number; url?: strin } ); -export type DocConfig = Record< +export type DocumentationConfig = Record< string, { code: string; diff --git a/src/lib/util/fileLoaders/gist.ts b/src/lib/util/fileLoaders/gist.ts index 58ff85ea..974e24dc 100644 --- a/src/lib/util/fileLoaders/gist.ts +++ b/src/lib/util/fileLoaders/gist.ts @@ -5,6 +5,7 @@ import type { State } from '$lib/types'; import { defaultState } from '$lib/util/state'; import { addHistoryEntry } from '$lib/components/History/history'; +import { fetchJSON, fetchText } from '$lib/util/util'; const codeFileName = 'code.mmd'; const configFileName = 'config.json'; @@ -21,7 +22,7 @@ const isValidGist = (files: any): boolean => { const getFileContent = async (file: GithubFile): Promise => { if (file.truncated) { - return await (await fetch(file.raw_url)).text(); + return await fetchText(file.raw_url); } return file.content; }; @@ -49,9 +50,9 @@ const getGistData = async (gistURL: string): Promise => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, __, gistID, revisionID] = path.split('/'); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { html_url, files, history }: GistResponse = await ( - await fetch(`https://api.github.com/gists/${gistID}${revisionID ? '/' + revisionID : ''}`) - ).json(); + const { html_url, files, history }: GistResponse = await fetchJSON( + `https://api.github.com/gists/${gistID}${revisionID ? '/' + revisionID : ''}` + ); if (isValidGist(files)) { const code = await getFileContent(files[codeFileName]); let config = '{}'; @@ -96,12 +97,12 @@ export const loadGistData = async (gistURL: string): Promise => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, __, gistID, revisionID] = path.split('/'); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { history }: GistResponse = await ( - await fetch(`https://api.github.com/gists/${gistID}${revisionID ? '/' + revisionID : ''}`) - ).json(); + const { history }: GistResponse = await fetchJSON( + `https://api.github.com/gists/${gistID}${revisionID ? '/' + revisionID : ''}` + ); const gistHistory: GistData[] = []; for (const entry of history) { - const data: GistData | undefined = await getGistData(entry.url).catch(() => undefined); + const data: GistData | undefined = await getGistData(entry.url).catch(); data && gistHistory.push(data); } if (gistHistory.length === 0) { diff --git a/src/lib/util/fileLoaders/loader.ts b/src/lib/util/fileLoaders/loader.ts index 596d02a2..ce2ea348 100644 --- a/src/lib/util/fileLoaders/loader.ts +++ b/src/lib/util/fileLoaders/loader.ts @@ -1,6 +1,8 @@ import { loadGistData } from './gist'; -import { updateCodeStore, defaultState } from '../state'; +import { updateCodeStore, defaultState } from '$lib/util/state'; +import { fetchText } from '$lib/util/util'; import type { Loader, State } from '$lib/types'; + const loaders: Record = { gist: loadGistData }; @@ -8,34 +10,18 @@ const loaders: Record = { export const loadDataFromUrl = async (): Promise => { const searchParams = new URLSearchParams(window.location.search); let state: Partial = defaultState; - let code: string | undefined = undefined; - let config: string | undefined = undefined; let loaded = false; const codeURL: string | undefined = searchParams.get('code') ?? undefined; const configURL: string | undefined = searchParams.get('config') ?? undefined; + let code: string | undefined; + const config = configURL ? await fetchText(configURL) : defaultState.mermaid; + if (codeURL) { - code = await (await fetch(codeURL)).text(); + code = await fetchText(codeURL); loaded = true; } - if (configURL) { - config = await (await fetch(configURL)).text(); - } else { - config = defaultState.mermaid; - } - if (!code) { - for (const [key, value] of searchParams.entries()) { - if (key in loaders) { - try { - state = await loaders[key](value); - loaded = true; - break; - } catch (err) { - console.error(err); - } - } - } - } else { + if (code) { if (!codeURL) { throw new Error('Code URL is not defined'); } @@ -50,6 +36,18 @@ export const loadDataFromUrl = async (): Promise => { } } }; + } else { + for (const [key, value] of searchParams.entries()) { + if (key in loaders) { + try { + state = await loaders[key](value); + loaded = true; + break; + } catch (error) { + console.error(error); + } + } + } } loaded && updateCodeStore({ diff --git a/src/lib/util/persist.ts b/src/lib/util/persist.ts index 31aeba3f..418ede1a 100644 --- a/src/lib/util/persist.ts +++ b/src/lib/util/persist.ts @@ -70,13 +70,13 @@ const deserialize = (value?: string | null): unknown => { if (value !== null && value !== undefined) { try { return ESSerializer.deserialize(value); - } catch (e) { + } catch { // Do nothing // use the value "as is" } try { return JSON.parse(value); - } catch (e) { + } catch { // Do nothing // use the value "as is" } @@ -179,11 +179,9 @@ function getBrowserStorage( const listenerFunction = (event: StorageEvent) => { const eventKey = event.key; if (event.storageArea === browserStorage) { - listeners - .filter(({ key }) => key === eventKey) - .forEach(({ listener }) => { - listener(deserialize(event.newValue)); - }); + for (const { listener } of listeners.filter(({ key }) => key === eventKey)) { + listener(deserialize(event.newValue)); + } } }; const connect = () => { diff --git a/src/lib/util/serde.test.ts b/src/lib/util/serde.test.ts index c66f7f0f..b8f591f1 100644 --- a/src/lib/util/serde.test.ts +++ b/src/lib/util/serde.test.ts @@ -3,14 +3,14 @@ import { serializeState, deserializeState, type SerdeType } from './serde'; import { defaultState } from './state'; import type { State } from '$lib/types'; -describe('Serde tests', () => { - const verifySerde = (state: State, serde?: SerdeType): string => { - const serialized = serializeState(state, serde); - const deserialized = deserializeState(serialized); - expect(deserialized).to.deep.equal(state); - return serialized; - }; +const verifySerde = (state: State, serde?: SerdeType): string => { + const serialized = serializeState(state, serde); + const deserialized = deserializeState(serialized); + expect(deserialized).to.deep.equal(state); + return serialized; +}; +describe('Serde tests', () => { it('should serialize and deserialize with default serde', () => { expect(verifySerde(defaultState)).toMatchInlineSnapshot( '"pako:eNpVj81qw0AMhF9F6NRC_AI-BGK7zSXQQHLz5iBsObuk-8Naphjb7551fEl1EjPfiNGEjW8Zc7xHChqulXKQ5lCXOppeLPU3yLL9fGQB6x2PMxQfRw-99iEYd__c-GKFoJxOK8Yg2rjHslnlK__jeIaqPlEQH27vzvXPz_BVm7NO5_87OnJKfdcd5R1lDUUoKb4Q3KHlaMm0qfq0KgpFs2WFeVpb7mj4FYXKLQmlQfxldA3mEgfe4RBaEq4MpaftJi5PNtJU8w"' diff --git a/src/lib/util/state.ts b/src/lib/util/state.ts index 6181096a..1ab17309 100644 --- a/src/lib/util/state.ts +++ b/src/lib/util/state.ts @@ -2,7 +2,7 @@ import { writable, get, type Readable, derived } from 'svelte/store'; import { persist, localStorage } from './persist'; import { saveStatistics, countLines } from './stats'; import { serializeState, deserializeState } from './serde'; -import { cmdKey, errorDebug } from './util'; +import { cmdKey, errorDebug, formatJSON } from './util'; import { parse } from './mermaid'; import type { ErrorHash, MarkerData, State, ValidatedState } from '$lib/types'; @@ -16,13 +16,9 @@ export const defaultState: State = { C -->|Two| E[iPhone] C -->|Three| F[fa:fa-car Car] `, - mermaid: JSON.stringify( - { - theme: 'default' - }, - null, - 2 - ), + mermaid: formatJSON({ + theme: 'default' + }), autoSync: true, updateDiagram: true }; @@ -65,16 +61,16 @@ const processState = async (state: State) => { processed.serialized = serializeState(state); await parse(state.code); JSON.parse(state.mermaid); - } catch (e) { - processed.error = e; + } catch (error) { + processed.error = error; errorDebug(); - console.error(e); - if ('hash' in e) { + console.error(error); + if ('hash' in error) { try { const { loc: { first_line, last_line, first_column, last_column } // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - } = e.hash as ErrorHash; + } = error.hash as ErrorHash; const marker: MarkerData = { severity: 8, // Error startLineNumber: first_line, @@ -82,11 +78,11 @@ const processState = async (state: State) => { endLineNumber: last_line, endColumn: last_column + 1, // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment - message: e.str + message: error.str }; processed.errorMarkers = [marker]; - } catch (err) { - console.error('Error without line helper', err); + } catch (error) { + console.error('Error without line helper', error); } } } @@ -120,11 +116,11 @@ export const loadState = (data: string): void => { ) { delete mermaidConfig.securityLevel; // Prevent setting overriding securityLevel when loading state to mitigate possible XSS attack } - state.mermaid = JSON.stringify(mermaidConfig, null, 2); - } catch (e) { + state.mermaid = formatJSON(mermaidConfig); + } catch (error) { state = get(inputStateStore); if (data) { - console.error('Init error', e); + console.error('Init error', error); state.code = urlParseFailedState; state.mermaid = defaultState.mermaid; } @@ -185,7 +181,7 @@ export const toggleDarkTheme = (dark: boolean): void => { config.theme = dark ? 'dark' : 'default'; } - return { ...state, mermaid: JSON.stringify(config, null, 2) }; + return { ...state, mermaid: formatJSON(config) }; }); }; diff --git a/src/lib/util/stats.ts b/src/lib/util/stats.ts index c349088d..3f7bc709 100644 --- a/src/lib/util/stats.ts +++ b/src/lib/util/stats.ts @@ -20,8 +20,8 @@ export const initAnalytics = async (): Promise => { }) ] }); - } catch (e) { - console.log(e); + } catch (error) { + console.log(error); console.info('Analytics blocked ;)'); } } @@ -87,10 +87,10 @@ export const logEvent = (name: AnalyticsEvent, data?: unknown): void => { return; } const key = data ? JSON.stringify({ name, data }) : name; - if (!timeouts.has(key)) { - void analytics.track(name, data); - } else { + if (timeouts.has(key)) { clearTimeout(timeouts.get(key)); + } else { + void analytics.track(name, data); } timeouts.set( key, diff --git a/src/lib/util/theme.ts b/src/lib/util/theme.ts index 0da7f3ad..a1dcea50 100644 --- a/src/lib/util/theme.ts +++ b/src/lib/util/theme.ts @@ -16,7 +16,7 @@ export const themeStore: Writable = persist( 'themeStore' ); -const darkThemes = [ +const darkThemes = new Set([ 'dark', 'synthwave', 'halloween', @@ -25,13 +25,13 @@ const darkThemes = [ 'luxury', 'black', 'dracula' -]; +]); export const setTheme = (theme: string): void => { if (theme.includes(' ')) { theme = theme.split(' ')[1].trim(); } - const isDark = darkThemes.includes(theme); + const isDark = darkThemes.has(theme); console.log('Setting theme', theme); themeStore.set({ theme, isDark }); logEvent('themeChange', { theme, isDark }); diff --git a/src/lib/util/util.ts b/src/lib/util/util.ts index bf2c7606..73964629 100644 --- a/src/lib/util/util.ts +++ b/src/lib/util/util.ts @@ -38,3 +38,13 @@ export const errorDebug = (limit = 100) => { debugger; } }; + +export const formatJSON = (data: unknown): string => JSON.stringify(data, undefined, 2); +export const fetchJSON = async (url: string): Promise => { + const res = await fetch(url); + return res.json() as T; +}; +export const fetchText = async (url: string): Promise => { + const res = await fetch(url); + return res.text(); +}; diff --git a/src/routes/edit/+page.svelte b/src/routes/edit/+page.svelte index ae92d28d..105cfd01 100644 --- a/src/routes/edit/+page.svelte +++ b/src/routes/edit/+page.svelte @@ -9,11 +9,11 @@ import { inputStateStore, stateStore, updateCodeStore } from '$lib/util/state'; import { cmdKey, initHandler, syncDiagram } from '$lib/util/util'; import { onMount } from 'svelte'; - import type { Tab, DocConfig, EditorMode, ValidatedState } from '$lib/types'; + import type { Tab, DocumentationConfig, EditorMode, ValidatedState } from '$lib/types'; import { base } from '$app/paths'; const docURLBase = 'https://mermaid-js.github.io/mermaid'; - const docMap: DocConfig = { + const docMap: DocumentationConfig = { graph: { code: '/#/flowchart', config: '/#/flowchart?id=configuration' diff --git a/yarn.lock b/yarn.lock index ef0945fb..2431b445 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,7 +92,7 @@ resolved "https://registry.yarnpkg.com/@analytics/type-utils/-/type-utils-0.6.0.tgz#1b8745516da5a654d292ed3f2db893c61cd3d9c5" integrity sha512-1Yw7u/COtxx06BfwlI+kVhsa/upKYzmCNrT4c8QDeCY2KMYlnijkUjtHiPU08HxyTIVB5j6d75O0YWVIHwQS8g== -"@babel/code-frame@^7.10.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -104,6 +104,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -424,6 +429,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-14.17.0.tgz" integrity sha512-w8VZUN/f7SSbvVReb9SWp6cJFevxb4/nkG65yLAya//98WgocKm5PLDAtSs5CtJJJM+kHmJjO/6mmYW4MHShZA== +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + "@types/pako@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.0.tgz#12ab4c19107528452e73ac99132c875ccd43bdfb" @@ -934,6 +944,11 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -1091,6 +1106,18 @@ ci-info@^3.1.1: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz" integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== +ci-info@^3.6.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" @@ -2328,6 +2355,13 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es6-promise@^3.1.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -2543,6 +2577,28 @@ eslint-plugin-tailwindcss@3.7.0: postcss "^8.4.4" tailwindcss "^3.2.2" +eslint-plugin-unicorn@^45.0.0: + version "45.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.0.tgz#a6650ff3000dc1a87cc2f6ac3a11edcde61712e2" + integrity sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ== + dependencies: + "@babel/helper-validator-identifier" "^7.19.1" + ci-info "^3.6.1" + clean-regexp "^1.0.0" + eslint-utils "^3.0.0" + esquery "^1.4.0" + indent-string "^4.0.0" + is-builtin-module "^3.2.0" + jsesc "3.0.2" + lodash "^4.17.21" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.24" + regjsparser "0.9.1" + safe-regex "^2.1.1" + semver "^7.3.8" + strip-indent "^3.0.0" + eslint-plugin-vitest@^0.0.20: version "0.0.20" resolved "https://registry.yarnpkg.com/eslint-plugin-vitest/-/eslint-plugin-vitest-0.0.20.tgz#875f1bb086e66bdd12b7c60f59ddd1dfa28252d7" @@ -2843,6 +2899,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -3111,6 +3175,11 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -3239,6 +3308,11 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" @@ -3251,6 +3325,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-builtin-module@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== + dependencies: + builtin-modules "^3.3.0" + is-ci@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz" @@ -3462,6 +3543,21 @@ jsdom@20.0.3: ws "^8.11.0" xml-name-validator "^4.0.0" +jsesc@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -3552,6 +3648,11 @@ lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + lint-staged@13.0.3: version "13.0.3" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.0.3.tgz#d7cdf03a3830b327a2b63c6aec953d71d9dc48c6" @@ -3604,6 +3705,13 @@ local-pkg@^0.4.2: resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.2.tgz#13107310b77e74a0e513147a131a2ba288176c2f" integrity sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg== +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -3886,6 +3994,16 @@ nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -4010,6 +4128,13 @@ ospath@^1.2.2: resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" @@ -4017,6 +4142,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" @@ -4031,6 +4163,11 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pako@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -4043,6 +4180,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse5@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" @@ -4125,6 +4272,11 @@ plausible-tracker@^0.3.1: resolved "https://registry.yarnpkg.com/plausible-tracker/-/plausible-tracker-0.3.8.tgz#9b8b322cc41e0e1d6473869ef234deea365a5a40" integrity sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg== +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -4565,6 +4717,25 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -4585,11 +4756,23 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regexp-tree@^0.1.24, regexp-tree@~0.1.1: + version "0.1.24" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== + regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +regjsparser@0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" @@ -4612,7 +4795,7 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.7, resolve@^1.22.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -4715,6 +4898,13 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -4737,7 +4927,7 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4754,6 +4944,13 @@ semver@^7.3.2, semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + set-cookie-parser@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" @@ -4882,6 +5079,32 @@ sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + sshpk@^1.14.1: version "1.16.1" resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" @@ -5292,6 +5515,16 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + typescript@4.9.3: version "4.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" @@ -5374,6 +5607,14 @@ v8-to-istanbul@^9.0.0: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + variable-diff@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/variable-diff/-/variable-diff-1.1.0.tgz"