├── .npmrc ├── static └── favicon.png ├── src ├── lib │ ├── index.ts │ ├── handle.ts │ ├── constants │ │ ├── constants.ts │ │ └── typesMaps.ts │ ├── core │ │ ├── parse.ts │ │ ├── detect.ts │ │ ├── buildSelectors.ts │ │ ├── selectors.ts │ │ └── types.ts │ ├── types │ │ └── index.ts │ └── utils │ │ ├── utils.ts │ │ └── payloads.ts ├── index.test.ts ├── routes │ ├── +layout.server.ts │ └── +page.svelte ├── hooks.server.ts ├── app.d.ts └── app.html ├── .gitignore ├── .eslintignore ├── .prettierignore ├── tests └── test.ts ├── vite.config.ts ├── .prettierrc ├── playwright.config.ts ├── .eslintrc.cjs ├── tsconfig.json ├── svelte.config.js ├── LICENSE ├── package.json ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bhaskarGyan/sveltekit-device-detector/HEAD/static/favicon.png -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { handleDeviceDetector } from './handle'; 2 | 3 | export type { DevicePayload } from './types'; 4 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | 3 | describe('sum test', () => { 4 | it('adds 1 + 2 to equal 3', () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutServerLoad } from './$types'; 2 | 3 | export const load = (async ({ locals }) => { 4 | return { deviceType: locals.deviceType }; 5 | }) satisfies LayoutServerLoad; 6 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /tests/test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected h1', async ({ page }) => { 4 | await page.goto('/'); 5 | await expect(page.getByRole('heading', { name: 'Welcome to SvelteKit' })).toBeVisible(); 6 | }); 7 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | test: { 7 | include: ['src/**/*.{test,spec}.{js,ts}'] 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { handleDeviceDetector } from '$lib'; 2 | import { sequence } from '@sveltejs/kit/hooks'; 3 | 4 | const deviceDetector = handleDeviceDetector({}); 5 | 6 | export const handle = sequence(deviceDetector, ({ resolve, event }) => { 7 | return resolve(event); 8 | }); 9 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | }, 8 | testDir: 'tests' 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | interface Locals { 7 | deviceType: DevicePayload; 8 | } 9 | // interface PageData {} 10 | // interface Platform {} 11 | } 12 | } 13 | 14 | export {}; 15 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |Device type
13 |{JSON.stringify(data)}
14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /src/lib/handle.ts: -------------------------------------------------------------------------------- 1 | import type { Handle } from '@sveltejs/kit'; 2 | import { deviceDetect } from './core/detect'; 3 | import { getSelectorsByUserAgent } from './core/selectors'; 4 | 5 | export function handleDeviceDetector( 6 | options: {}, 7 | passedHandle: Handle = async ({ event, resolve }) => resolve(event) 8 | ): Handle { 9 | return async function handle({ event, resolve }) { 10 | const ua = event.request.headers.get('user-agent') || ''; 11 | const device = deviceDetect(ua); 12 | const deviceMetadata = getSelectorsByUserAgent(ua); 13 | event.locals.deviceType = { ...deviceMetadata, ...device }; 14 | 15 | const response = await passedHandle({ event, resolve }); 16 | 17 | return response; 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /src/lib/constants/constants.ts: -------------------------------------------------------------------------------- 1 | export const DeviceTypes = { 2 | Mobile: 'mobile', 3 | Tablet: 'tablet', 4 | SmartTv: 'smarttv', 5 | Console: 'console', 6 | Wearable: 'wearable', 7 | Embedded: 'embedded', 8 | Browser: undefined 9 | }; 10 | 11 | export const BrowserTypes = { 12 | Chrome: 'Chrome', 13 | Firefox: 'Firefox', 14 | Opera: 'Opera', 15 | Yandex: 'Yandex', 16 | Safari: 'Safari', 17 | InternetExplorer: 'Internet Explorer', 18 | Edge: 'Edge', 19 | Chromium: 'Chromium', 20 | Ie: 'IE', 21 | MobileSafari: 'Mobile Safari', 22 | EdgeChromium: 'Edge Chromium', 23 | MIUI: 'MIUI Browser', 24 | SamsungBrowser: 'Samsung Browser' 25 | }; 26 | 27 | export const OsTypes = { 28 | IOS: 'iOS', 29 | Android: 'Android', 30 | WindowsPhone: 'Windows Phone', 31 | Windows: 'Windows', 32 | MAC_OS: 'Mac OS' 33 | }; 34 | 35 | export const InitialDeviceTypes = { 36 | isMobile: false, 37 | isTablet: false, 38 | isBrowser: false, 39 | isSmartTV: false, 40 | isConsole: false, 41 | isWearable: false 42 | }; 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Bhaskar gyan vardhan 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 | -------------------------------------------------------------------------------- /src/lib/core/parse.ts: -------------------------------------------------------------------------------- 1 | import UAParser from 'ua-parser-js/dist/ua-parser.min'; 2 | 3 | export const ClientUAInstance = new UAParser(); 4 | 5 | export const browser = ClientUAInstance.getBrowser(); 6 | export const cpu = ClientUAInstance.getCPU(); 7 | export const device = ClientUAInstance.getDevice(); 8 | export const engine = ClientUAInstance.getEngine(); 9 | export const os = ClientUAInstance.getOS(); 10 | export const ua = ClientUAInstance.getUA(); 11 | export const setUa = (userAgentString: string) => ClientUAInstance.setUA(userAgentString); 12 | 13 | export const parseUserAgent = (userAgent: string) => { 14 | if (!userAgent) { 15 | console.error('No userAgent string was provided'); 16 | return; 17 | } 18 | 19 | const UserAgentInstance = new UAParser(userAgent); 20 | 21 | return { 22 | UA: UserAgentInstance, 23 | browser: UserAgentInstance.getBrowser(), 24 | cpu: UserAgentInstance.getCPU(), 25 | device: UserAgentInstance.getDevice(), 26 | engine: UserAgentInstance.getEngine(), 27 | os: UserAgentInstance.getOS(), 28 | ua: UserAgentInstance.getUA(), 29 | setUserAgent: (userAgentString: string) => UserAgentInstance.setUA(userAgentString) 30 | }; 31 | }; 32 | -------------------------------------------------------------------------------- /src/lib/core/detect.ts: -------------------------------------------------------------------------------- 1 | import * as UAHelper from './parse'; 2 | import * as create from '../utils/payloads'; 3 | import { checkDeviceType } from '../utils/utils'; 4 | import type { Device, Browser, Engine, OS, DeviceType } from '$lib/types'; 5 | 6 | export function deviceDetect(userAgent: string) { 7 | const { 8 | device, 9 | browser, 10 | engine, 11 | os, 12 | ua 13 | }: { device: Device; browser: Browser; engine: Engine; os: OS; ua: string } = userAgent 14 | ? UAHelper.parseUserAgent(userAgent) 15 | : UAHelper; 16 | 17 | const type: DeviceType = checkDeviceType(device.type); 18 | const { isBrowser, isMobile, isTablet, isSmartTV, isConsole, isWearable, isEmbedded } = type; 19 | 20 | if (isBrowser) { 21 | return create.browserPayload(isBrowser, browser, engine, os, ua); 22 | } 23 | 24 | if (isSmartTV) { 25 | return create.smartTvPayload(isSmartTV, engine, os, ua); 26 | } 27 | 28 | if (isConsole) { 29 | return create.consolePayload(isConsole, engine, os, ua); 30 | } 31 | 32 | if (isMobile) { 33 | return create.mobilePayload(type, device, os, ua); 34 | } 35 | 36 | if (isTablet) { 37 | return create.mobilePayload(type, device, os, ua); 38 | } 39 | 40 | if (isWearable) { 41 | return create.wearablePayload(isWearable, engine, os, ua); 42 | } 43 | 44 | if (isEmbedded) { 45 | return create.embeddedPayload(isEmbedded, device, engine, os, ua); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/lib/types/index.ts: -------------------------------------------------------------------------------- 1 | export interface Browser { 2 | major: string; 3 | version: string; 4 | name: string; 5 | } 6 | export interface Engine { 7 | name: string; 8 | version: string; 9 | } 10 | export interface OS { 11 | name: string; 12 | version: string; 13 | } 14 | export interface Device { 15 | vendor: string; 16 | model: string; 17 | type: string; 18 | } 19 | 20 | export interface DeviceOptions { 21 | device: Device; 22 | browser: Browser; 23 | os: OS; 24 | engine: Engine; 25 | ua: string; 26 | } 27 | 28 | export interface DeviceType { 29 | isMobile: boolean; 30 | isBrowser: boolean; 31 | isAndroid: boolean; 32 | isIOS: boolean; 33 | isSmartTV: boolean; 34 | isConsole: boolean; 35 | isWearable: boolean; 36 | isEmbedded: boolean; 37 | isMobileSafari: boolean; 38 | isChromium: boolean; 39 | isTablet: boolean; 40 | isDesktop: boolean; 41 | isWinPhone: boolean; 42 | isChrome: boolean; 43 | isFirefox: boolean; 44 | isSafari: boolean; 45 | isOpera: boolean; 46 | isIE: boolean; 47 | osVersion: string; 48 | fullBrowserVersion: string; 49 | browserVersion: string; 50 | mobileVendor: string; 51 | mobileModel: string; 52 | getUA: string; 53 | isEdge: boolean; 54 | isYandex: boolean; 55 | isIOS13: boolean; 56 | isIPad13: boolean; 57 | isIPhone13: boolean; 58 | isIPod13: boolean; 59 | isElectron: boolean; 60 | isEdgeChromium: boolean; 61 | isLegacyEdge: boolean; 62 | isWindows: boolean; 63 | isMacOs: boolean; 64 | isMIUI: boolean; 65 | isSamsungBrowser: boolean; 66 | isWebView: boolean; 67 | isCrawler: boolean; 68 | } 69 | 70 | export interface DevicePayload extends DeviceType { 71 | browserMajorVersion?: string; 72 | browserFullVersion?: string; 73 | browserName?: string; 74 | engineName?: string; 75 | engineVersion?: string; 76 | osName?: string; 77 | osVersion: string; 78 | userAgent?: string; 79 | vendor?: string; 80 | model?: string; 81 | os?: string; 82 | ua?: string; 83 | } 84 | -------------------------------------------------------------------------------- /src/lib/utils/utils.ts: -------------------------------------------------------------------------------- 1 | import { DeviceTypes, InitialDeviceTypes, BrowserTypes } from '../constants/constants'; 2 | import { setUa } from '../core/parse'; 3 | 4 | export const checkDeviceType = (type: string): DeviceType => { 5 | switch (type) { 6 | case DeviceTypes.Mobile: 7 | return { isMobile: true }; 8 | case DeviceTypes.Tablet: 9 | return { isTablet: true }; 10 | case DeviceTypes.SmartTv: 11 | return { isSmartTV: true }; 12 | case DeviceTypes.Console: 13 | return { isConsole: true }; 14 | case DeviceTypes.Wearable: 15 | return { isWearable: true }; 16 | case DeviceTypes.Browser: 17 | return { isBrowser: true }; 18 | case DeviceTypes.Embedded: 19 | return { isEmbedded: true }; 20 | default: 21 | return InitialDeviceTypes; 22 | } 23 | }; 24 | 25 | export const getCurrentBrowser = (name: string) => { 26 | switch (name) { 27 | case BrowserTypes.Chrome: 28 | case BrowserTypes.Opera: 29 | case BrowserTypes.Firefox: 30 | case BrowserTypes.Yandex: 31 | case BrowserTypes.Safari: 32 | case BrowserTypes.Ie: 33 | case BrowserTypes.Edge: 34 | case BrowserTypes.Chromium: 35 | return true; 36 | default: 37 | return false; 38 | } 39 | }; 40 | 41 | export const setUserAgent = (userAgent: string) => setUa(userAgent); 42 | 43 | export const mockUserAgent = (userAgent: string) => { 44 | window.navigator.__defineGetter__('userAgent', () => userAgent); 45 | }; 46 | 47 | export const setDefaults = (p: string, d = 'none') => (p ? p : d); 48 | 49 | export const getNavigatorInstance = () => { 50 | if (typeof window !== 'undefined') { 51 | if (window.navigator || navigator) { 52 | return window.navigator || navigator; 53 | } 54 | } 55 | 56 | return false; 57 | }; 58 | 59 | export const isIOS13Check = (type: string) => { 60 | const nav = getNavigatorInstance(); 61 | return ( 62 | nav && 63 | nav.platform && 64 | (nav.platform.indexOf(type) !== -1 || (nav.platform === 'MacIntel' && nav.maxTouchPoints > 0)) 65 | ); 66 | }; 67 | -------------------------------------------------------------------------------- /src/lib/core/buildSelectors.ts: -------------------------------------------------------------------------------- 1 | import type { DeviceOptions } from '$lib/types'; 2 | import * as UAHelper from './parse'; 3 | import * as types from './types'; 4 | 5 | export function buildSelectorsObject(options: DeviceOptions) { 6 | const { device, browser, os, engine, ua } = options ? options : UAHelper; 7 | return { 8 | isSmartTV: types.isSmartTVType(device), 9 | isConsole: types.isConsoleType(device), 10 | isWearable: types.isWearableType(device), 11 | isEmbedded: types.isEmbeddedType(device), 12 | isMobileSafari: types.isMobileSafariType(browser) || types.getIPad13(), 13 | isChromium: types.isChromiumType(browser), 14 | isMobile: types.isMobileType(device), 15 | isTablet: types.isTabletType(device) || types.getIPad13(), 16 | isBrowser: types.isBrowserType(device), 17 | isDesktop: types.isBrowserType(device), 18 | isAndroid: types.isAndroidType(os), 19 | isWinPhone: types.isWinPhoneType(os), 20 | isIOS: types.isIOSType(os) || types.getIPad13(), 21 | isChrome: types.isChromeType(browser), 22 | isFirefox: types.isFirefoxType(browser), 23 | isSafari: types.isSafariType(browser), 24 | isOpera: types.isOperaType(browser), 25 | isIE: types.isIEType(browser), 26 | osVersion: types.getOsVersion(os), 27 | osName: types.getOsName(os), 28 | fullBrowserVersion: types.getBrowserFullVersion(browser), 29 | browserVersion: types.getBrowserVersion(browser), 30 | browserName: types.getBrowserName(browser), 31 | mobileVendor: types.getMobileVendor(device), 32 | mobileModel: types.getMobileModel(device), 33 | engineName: types.getEngineName(engine), 34 | engineVersion: types.getEngineVersion(engine), 35 | getUA: types.getUseragent(ua), 36 | isEdge: types.isEdgeType(browser) || types.isEdgeChromiumType(ua), 37 | isYandex: types.isYandexType(browser), 38 | isIOS13: types.getIOS13(), 39 | isIPad13: types.getIPad13(), 40 | isIPhone13: types.getIphone13(), 41 | isIPod13: types.getIPod13(), 42 | isElectron: types.isElectronType(), 43 | isEdgeChromium: types.isEdgeChromiumType(ua), 44 | isLegacyEdge: types.isEdgeType(browser) && !types.isEdgeChromiumType(ua), 45 | isWindows: types.isWindowsType(os), 46 | isMacOs: types.isMacOsType(os), 47 | isMIUI: types.isMIUIType(browser), 48 | isSamsungBrowser: types.isSamsungBrowserType(browser), 49 | isWebView: types.isWebview(ua), 50 | isCrawler: types.isCrawler(ua) 51 | }; 52 | } 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-device-detector", 3 | "version": "2.0.1", 4 | "license": "MIT", 5 | "author": { 6 | "name": "Bhaskar Gyan Vardhan" 7 | }, 8 | "description": "Detect device type and render your component according to it", 9 | "scripts": { 10 | "dev": "vite dev", 11 | "build": "vite build && npm run package", 12 | "preview": "vite preview", 13 | "package": "svelte-kit sync && svelte-package && publint", 14 | "prepublishOnly": "npm run package", 15 | "test": "playwright test", 16 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 17 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 18 | "test:unit": "vitest", 19 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 20 | "format": "prettier --plugin-search-dir . --write ." 21 | }, 22 | "exports": { 23 | ".": { 24 | "types": "./dist/index.d.ts", 25 | "svelte": "./dist/index.js" 26 | } 27 | }, 28 | "files": [ 29 | "dist", 30 | "!dist/**/*.test.*", 31 | "!dist/**/*.spec.*" 32 | ], 33 | "peerDependencies": { 34 | "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0", 35 | "ua-parser-js": "^1.0.35" 36 | }, 37 | "devDependencies": { 38 | "@playwright/test": "^1.28.1", 39 | "@sveltejs/adapter-auto": "^2.0.0", 40 | "@sveltejs/kit": "^1.5.0", 41 | "@sveltejs/package": "^2.0.0", 42 | "@types/ua-parser-js": "^0.7.36", 43 | "@typescript-eslint/eslint-plugin": "^5.45.0", 44 | "@typescript-eslint/parser": "^5.45.0", 45 | "eslint": "^8.28.0", 46 | "eslint-config-prettier": "^8.5.0", 47 | "eslint-plugin-svelte3": "^4.0.0", 48 | "prettier": "^2.8.0", 49 | "prettier-plugin-svelte": "^2.8.1", 50 | "publint": "^0.1.9", 51 | "svelte": "^3.54.0", 52 | "svelte-check": "^3.0.1", 53 | "tslib": "^2.4.1", 54 | "typescript": "^5.0.0", 55 | "vite": "^4.2.0", 56 | "vitest": "^0.25.3" 57 | }, 58 | "svelte": "./dist/index.js", 59 | "types": "./dist/index.d.ts", 60 | "type": "module", 61 | "dependencies": { 62 | "ua-parser-js": "^1.0.35" 63 | }, 64 | "keywords": [ 65 | "svelte", 66 | "sveltekit", 67 | "device", 68 | "useragent", 69 | "mobile", 70 | "phone", 71 | "tablet", 72 | "detect", 73 | "device", 74 | "browser", 75 | "smart-tv", 76 | "smarttv", 77 | "version", 78 | "model", 79 | "console" 80 | ], 81 | "repository": { 82 | "type": "git", 83 | "url": "git@github.com:bhaskarGyan/sveltekit-device-detector.git" 84 | }, 85 | "bugs": { 86 | "url": "https://github.com/bhaskarGyan/sveltekit-device-detector/issues" 87 | }, 88 | "homepage": "https://github.com/bhaskarGyan/sveltekit-device-detector#readme" 89 | } 90 | -------------------------------------------------------------------------------- /src/lib/utils/payloads.ts: -------------------------------------------------------------------------------- 1 | import type { Browser, Device, Engine, OS } from '$lib/types'; 2 | import { setDefaults, type DeviceType } from './utils'; 3 | 4 | export const browserPayload = ( 5 | isBrowser: boolean, 6 | browser: Browser, 7 | engine: Engine, 8 | os: OS, 9 | ua: string 10 | ): DevicePayload => ({ 11 | isBrowser, 12 | browserMajorVersion: setDefaults(browser.major), 13 | browserFullVersion: setDefaults(browser.version), 14 | browserName: setDefaults(browser.name), 15 | engineName: setDefaults(engine.name), 16 | engineVersion: setDefaults(engine.version), 17 | osName: setDefaults(os.name), 18 | osVersion: setDefaults(os.version), 19 | userAgent: setDefaults(ua) 20 | }); 21 | 22 | export const mobilePayload = ( 23 | type: DeviceType, 24 | device: Device, 25 | os: OS, 26 | ua: string 27 | ): DevicePayload => ({ 28 | ...type, 29 | vendor: setDefaults(device.vendor), 30 | model: setDefaults(device.model), 31 | os: setDefaults(os.name), 32 | osVersion: setDefaults(os.version), 33 | ua: setDefaults(ua), 34 | userAgent: setDefaults(ua) 35 | }); 36 | 37 | export const smartTvPayload = ( 38 | isSmartTV: boolean, 39 | engine: Engine, 40 | os: OS, 41 | ua: string 42 | ): DevicePayload => ({ 43 | isSmartTV, 44 | engineName: setDefaults(engine.name), 45 | engineVersion: setDefaults(engine.version), 46 | osName: setDefaults(os.name), 47 | osVersion: setDefaults(os.version), 48 | userAgent: setDefaults(ua) 49 | }); 50 | 51 | export const consolePayload = ( 52 | isConsole: boolean, 53 | engine: Engine, 54 | os: OS, 55 | ua: string 56 | ): DevicePayload => ({ 57 | isConsole, 58 | engineName: setDefaults(engine.name), 59 | engineVersion: setDefaults(engine.version), 60 | osName: setDefaults(os.name), 61 | osVersion: setDefaults(os.version), 62 | userAgent: setDefaults(ua) 63 | }); 64 | 65 | export const wearablePayload = ( 66 | isWearable: boolean, 67 | engine: Engine, 68 | os: OS, 69 | ua: string 70 | ): DevicePayload => ({ 71 | isWearable, 72 | engineName: setDefaults(engine.name), 73 | engineVersion: setDefaults(engine.version), 74 | osName: setDefaults(os.name), 75 | osVersion: setDefaults(os.version), 76 | userAgent: setDefaults(ua) 77 | }); 78 | 79 | export const embeddedPayload = ( 80 | isEmbedded: boolean, 81 | device: Device, 82 | engine: Engine, 83 | os: OS, 84 | ua: string 85 | ): DevicePayload => ({ 86 | isEmbedded, 87 | vendor: setDefaults(device.vendor), 88 | model: setDefaults(device.model), 89 | engineName: setDefaults(engine.name), 90 | engineVersion: setDefaults(engine.version), 91 | osName: setDefaults(os.name), 92 | osVersion: setDefaults(os.version), 93 | userAgent: setDefaults(ua) 94 | }); 95 | -------------------------------------------------------------------------------- /src/lib/core/selectors.ts: -------------------------------------------------------------------------------- 1 | import * as UAHelper from './parse'; 2 | import * as types from './types'; 3 | import { buildSelectorsObject } from './buildSelectors'; 4 | import type { Device, Browser, OS, Engine } from '$lib/types'; 5 | 6 | export const isSmartTV = types.isSmartTVType(UAHelper.device); 7 | export const isConsole = types.isConsoleType(UAHelper.device); 8 | export const isWearable = types.isWearableType(UAHelper.device); 9 | export const isEmbedded = types.isEmbeddedType(UAHelper.device); 10 | export const isMobileSafari = types.isMobileSafariType(UAHelper.browser) || types.getIPad13(); 11 | export const isChromium = types.isChromiumType(UAHelper.browser); 12 | export const isMobile = types.isMobileAndTabletType(UAHelper.device) || types.getIPad13(); 13 | export const isMobileOnly = types.isMobileType(UAHelper.device); 14 | export const isTablet = types.isTabletType(UAHelper.device) || types.getIPad13(); 15 | export const isBrowser = types.isBrowserType(UAHelper.device); 16 | export const isDesktop = types.isBrowserType(UAHelper.device); 17 | export const isAndroid = types.isAndroidType(UAHelper.os); 18 | export const isWinPhone = types.isWinPhoneType(UAHelper.os); 19 | export const isIOS = types.isIOSType(UAHelper.os) || types.getIPad13(); 20 | export const isChrome = types.isChromeType(UAHelper.browser); 21 | export const isFirefox = types.isFirefoxType(UAHelper.browser); 22 | export const isSafari = types.isSafariType(UAHelper.browser); 23 | export const isOpera = types.isOperaType(UAHelper.browser); 24 | export const isIE = types.isIEType(UAHelper.browser); 25 | export const osVersion = types.getOsVersion(UAHelper.os); 26 | export const osName = types.getOsName(UAHelper.os); 27 | export const fullBrowserVersion = types.getBrowserFullVersion(UAHelper.browser); 28 | export const browserVersion = types.getBrowserVersion(UAHelper.browser); 29 | export const browserName = types.getBrowserName(UAHelper.browser); 30 | export const mobileVendor = types.getMobileVendor(UAHelper.device); 31 | export const mobileModel = types.getMobileModel(UAHelper.device); 32 | export const engineName = types.getEngineName(UAHelper.engine); 33 | export const engineVersion = types.getEngineVersion(UAHelper.engine); 34 | export const getUA = types.getUseragent(UAHelper.ua); 35 | export const isEdge = types.isEdgeType(UAHelper.browser) || types.isEdgeChromiumType(UAHelper.ua); 36 | export const isYandex = types.isYandexType(UAHelper.browser); 37 | export const deviceType = types.getDeviceType(UAHelper.device); 38 | export const isIOS13 = types.getIOS13(); 39 | export const isIPad13 = types.getIPad13(); 40 | export const isIPhone13 = types.getIphone13(); 41 | export const isIPod13 = types.getIPod13(); 42 | export const isElectron = types.isElectronType(); 43 | export const isEdgeChromium = types.isEdgeChromiumType(UAHelper.ua); 44 | export const isLegacyEdge = 45 | types.isEdgeType(UAHelper.browser) && !types.isEdgeChromiumType(UAHelper.ua); 46 | export const isWindows = types.isWindowsType(UAHelper.os); 47 | export const isMacOs = types.isMacOsType(UAHelper.os); 48 | export const isMIUI = types.isMIUIType(UAHelper.browser); 49 | export const isSamsungBrowser = types.isSamsungBrowserType(UAHelper.browser); 50 | 51 | export const getSelectorsByUserAgent = (userAgent: string) => { 52 | if (!userAgent || typeof userAgent !== 'string') { 53 | console.error('No valid user agent string was provided'); 54 | return; 55 | } 56 | 57 | const { device, browser, os, engine, ua } = UAHelper.parseUserAgent(userAgent); 58 | return buildSelectorsObject({ device, browser, os, engine, ua }); 59 | }; 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## sveltekit-device-detector 2 | 3 |  4 | 5 | Detect device, and render view according to the detected device type. 6 | 7 | ## When to use this library 8 | 9 | This library uses a technique called [user agent sniffing](https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent) to detect device information. That means it works by examining the [User Agent string](https://en.wikipedia.org/wiki/User_agent) given by a browser and comparing it to a list of browser and device names it knows about. This technique works, but [has drawbacks](https://css-tricks.com/browser-detection-is-bad/) and may or may not be the right approach, depending on what you're trying to achieve. If you need to detect a specific browser type (e.g. Chrome, Safari, Internet Explorer) or specific category of device (e.g. all iPods), this library can do that. 10 | 11 | ## Flags 12 | 13 | You can use these flags to detect the device type. 14 | 15 | ```js 16 | interface DeviceType { 17 | isMobile: boolean; 18 | isBrowser: boolean; 19 | isAndroid: boolean; 20 | isIOS: boolean; 21 | isSmartTV: boolean; 22 | isConsole: boolean; 23 | isWearable: boolean; 24 | isEmbedded: boolean; 25 | isMobileSafari: boolean; 26 | isChromium: boolean; 27 | isTablet: boolean; 28 | isDesktop: boolean; 29 | isWinPhone: boolean; 30 | isChrome: boolean; 31 | isFirefox: boolean; 32 | isSafari: boolean; 33 | isOpera: boolean; 34 | isIE: boolean; 35 | osVersion: string; 36 | fullBrowserVersion: string; 37 | browserVersion: string; 38 | mobileVendor: string; 39 | mobileModel: string; 40 | getUA: string; 41 | isEdge: boolean; 42 | isYandex: boolean; 43 | isIOS13: boolean; 44 | isIPad13: boolean; 45 | isIPhone13: boolean; 46 | isIPod13: boolean; 47 | isElectron: boolean; 48 | isEdgeChromium: boolean; 49 | isLegacyEdge: boolean; 50 | isWindows: boolean; 51 | isMacOs: boolean; 52 | isMIUI: boolean; 53 | isSamsungBrowser: boolean; 54 | isWebView: boolean; 55 | isCrawler: boolean; 56 | } 57 | 58 | interface DevicePayload extends DeviceType { 59 | browserMajorVersion?: string; 60 | browserFullVersion?: string; 61 | browserName?: string; 62 | engineName?: string; 63 | engineVersion?: string; 64 | osName?: string; 65 | osVersion: string; 66 | userAgent?: string; 67 | vendor?: string; 68 | model?: string; 69 | os?: string; 70 | ua?: string; 71 | } 72 | ``` 73 | 74 | ## Installation 75 | 76 | To install, you can use npm or yarn: 77 | 78 | ``` 79 | npm install sveltekit-device-detector --save 80 | 81 | or 82 | 83 | yarn add sveltekit-device-detector 84 | ``` 85 | 86 | Update your `app.d.ts` file to look something like: 87 | 88 | ```ts 89 | import type { DevicePayload } from 'sveltekit-device-detector/dist/types'; 90 | // See https://kit.svelte.dev/docs#typescript 91 | // for information about these interfaces 92 | declare namespace App { 93 | interface Locals { 94 | deviceType: DevicePayload; 95 | } 96 | 97 | interface PageData { 98 | deviceType: DevicePayload; 99 | } 100 | 101 | interface Platform {} 102 | 103 | interface PrivateEnv {} 104 | 105 | interface PublicEnv {} 106 | } 107 | ``` 108 | 109 | Create a +layout.server.js file at the root and returning the DeviceType from there. 110 | 111 | ```js 112 | /** @type {import('./$types').LayoutServerLoad} */ 113 | export const load = ({ locals }) => { 114 | return { 115 | deviceType: locals.deviceType 116 | }; 117 | }; 118 | ``` 119 | 120 | You'll now have access to the `deviceType` data by using `$page.data.deviceType` or via the `parent` function from other `+page.server.js` load functions. 121 | 122 | ```svelte 123 | 127 | ``` 128 | 129 | ### Initializing 130 | 131 | > src/hooks.server.ts 132 | 133 | ```js 134 | import { handleDeviceDetector } from 'sveltekit-device-detector'; 135 | 136 | // You can do it like this, without passing a own handle function 137 | export const handle = handleDeviceDetector({}); 138 | 139 | // Or pass your handle function as second argument to handleDeviceDetector 140 | 141 | export const handle = handleSession({}, ({ event, resolve }) => { 142 | // event.locals is populated with the deviceType `event.locals.deviceType` 143 | 144 | // Do anything you want here 145 | return resolve(event); 146 | }); 147 | ``` 148 | 149 | In case you're using [sequence()](https://kit.svelte.dev/docs/modules#sveltejs-kit-hooks-sequence), do this 150 | 151 | ```js 152 | const deviceDetector = handleDeviceDetector({}); 153 | export const handle = sequence(deviceDetector, ({ resolve, event }) => { 154 | // event.locals is populated with the deviceType `event.locals.deviceType` 155 | // Do anything you want here 156 | return resolve(event); 157 | }); 158 | ``` 159 | -------------------------------------------------------------------------------- /src/lib/constants/typesMaps.ts: -------------------------------------------------------------------------------- 1 | const BrowserNamesMap = { 2 | '2345Explorer': '2345Explorer', 3 | '360 Browser': '360 Browser', 4 | Amaya: 'Amaya', 5 | 'Android Browser': 'Android Browser', 6 | Arora: 'Arora', 7 | Avant: 'Avant', 8 | Avast: 'Avast', 9 | AVG: 'AVG', 10 | BIDUBrowser: 'BIDUBrowser', 11 | Baidu: 'Baidu', 12 | Basilisk: 'Basilisk', 13 | Blazer: 'Blazer', 14 | Bolt: 'Bolt', 15 | Brave: 'Brave', 16 | Bowser: 'Bowser', 17 | Camino: 'Camino', 18 | Chimera: 'Chimera', 19 | 'Chrome Headless': 'Chrome Headless', 20 | 'Chrome WebView': 'Chrome WebView', 21 | Chrome: 'Chrome', 22 | Chromium: 'Chromium', 23 | 'Comodo Dragon': 'Comodo Dragon', 24 | Dillo: 'Dillo', 25 | Dolphin: 'Dolphin', 26 | Doris: 'Doris', 27 | Edge: 'Edge', 28 | Electron: 'Electron', 29 | Epiphany: 'Epiphany', 30 | Facebook: 'Facebook', 31 | Falkon: 'Falkon', 32 | Fennec: 'Fennec', 33 | Firebird: 'Firebird', 34 | 'Firefox Reality': 'Firefox Reality', 35 | Flock: 'Flock', 36 | Flow: 'Flow', 37 | GSA: 'GSA', 38 | GoBrowser: 'GoBrowser', 39 | 'ICE Browser': 'ICE Browser', 40 | IE: 'IE', 41 | IEMobile: 'IEMobile', 42 | IceApe: 'IceApe', 43 | IceCat: 'IceCat', 44 | IceDragon: 'IceDragon', 45 | Iceweasel: 'Iceweasel', 46 | Instagram: 'Instagram', 47 | Iridium: 'Iridium', 48 | Iron: 'Iron', 49 | Jasmine: 'Jasmine', 50 | 'K-Meleon': 'K-Meleon', 51 | Kindle: 'Kindle', 52 | Klar: 'Klar', 53 | Konqueror: 'Konqueror', 54 | LBBROWSER: 'LBBROWSER', 55 | Line: 'Line', 56 | Links: 'Links', 57 | Lunascape: 'Lunascape', 58 | Lynx: 'Lynx', 59 | 'MIUI Browser': 'MIUI Browser', 60 | 'Maemo Browser': 'Maemo Browser', 61 | Maemo: 'Maemo', 62 | Maxthon: 'Maxthon', 63 | 'MetaSr Midori': 'MetaSr Midori', 64 | Minimo: 'Minimo', 65 | 'Mobile Safari': 'Mobile Safari', 66 | Mosaic: 'Mosaic', 67 | Mozilla: 'Mozilla', 68 | NetFront: 'NetFront', 69 | NetSurf: 'NetSurf', 70 | Netfront: 'Netfront', 71 | Netscape: 'Netscape', 72 | NokiaBrowser: 'NokiaBrowser', 73 | Obigo: 'Obigo', 74 | 'Oculus Browser': 'Oculus Browser', 75 | OmniWeb: 'OmniWeb', 76 | 'Opera Coast': 'Opera Coast', 77 | 'Opera Mini': 'Opera Mini', 78 | 'Opera Mobi': 'Opera Mobi', 79 | 'Opera Tablet': 'Opera Tablet', 80 | PaleMoon: 'PaleMoon', 81 | PhantomJS: 'PhantomJS', 82 | Phoenix: 'Phoenix', 83 | Polaris: 'Polaris', 84 | Puffin: 'Puffin', 85 | QQ: 'QQ', 86 | QQBrowser: 'QQBrowser', 87 | QQBrowserLite: 'QQBrowserLite', 88 | Quark: 'Quark', 89 | QupZilla: 'QupZilla', 90 | RockMelt: 'RockMelt', 91 | Safari: 'Safari', 92 | 'Sailfish Browser': 'Sailfish Browser', 93 | 'Samsung Browser': 'Samsung Browser', 94 | SeaMonkey: 'SeaMonkey', 95 | Silk: 'Silk', 96 | Skyfire: 'Skyfire', 97 | Sleipnir: 'Sleipnir', 98 | Slim: 'Slim', 99 | SlimBrowser: 'SlimBrowser', 100 | Swiftfox: 'Swiftfox', 101 | Tesla: 'Tesla', 102 | 'Tizen Browser': 'Tizen Browser', 103 | UCBrowser: 'UCBrowser', 104 | 'UP.Browser': 'UP.Browser', 105 | Vivaldi: 'Vivaldi', 106 | Waterfox: 'Waterfox', 107 | WeChat: 'WeChat', 108 | Weibo: 'Weibo', 109 | Yandex: 'Yandex', 110 | baidu: 'baidu', 111 | iCab: 'iCab', 112 | w3m: 'w3m', 113 | 'Whale Browser': 'Whale Browser' 114 | }; 115 | 116 | const VendorNamesMap = { 117 | Acer: 'Acer', 118 | Alcatel: 'Alcatel', 119 | Amazon: 'Amazon', 120 | Apple: 'Apple', 121 | Archos: 'Archos', 122 | ASUS: 'ASUS', 123 | 'AT&T': 'AT&T', 124 | BenQ: 'BenQ', 125 | BlackBerry: 'BlackBerry', 126 | Dell: 'Dell', 127 | Essential: 'Essential', 128 | Fairphone: 'Fairphone', 129 | GeeksPhone: 'GeeksPhone', 130 | Google: 'Google', 131 | HP: 'HP', 132 | HTC: 'HTC', 133 | Huawei: 'Huawei', 134 | Jolla: 'Jolla', 135 | Lenovo: 'Lenovo', 136 | LG: 'LG', 137 | Meizu: 'Meizu', 138 | Microsoft: 'Microsoft', 139 | Motorola: 'Motorola', 140 | Nexian: 'Nexian', 141 | Nintendo: 'Nintendo', 142 | Nokia: 'Nokia', 143 | Nvidia: 'Nvidia', 144 | OnePlus: 'OnePlus', 145 | OPPO: 'OPPO', 146 | Ouya: 'Ouya', 147 | Palm: 'Palm', 148 | Panasonic: 'Panasonic', 149 | Pebble: 'Pebble', 150 | Polytron: 'Polytron', 151 | Realme: 'Realme', 152 | RIM: 'RIM', 153 | Roku: 'Roku', 154 | Samsung: 'Samsung', 155 | Sharp: 'Sharp', 156 | Siemens: 'Siemens', 157 | 'Sony Ericsson': 'Sony Ericsson', 158 | Sprint: 'Sprint', 159 | Tesla: 'Tesla', 160 | Vivo: 'Vivo', 161 | Vodafone: 'Vodafone', 162 | Xbox: 'Xbox', 163 | Xiaomi: 'Xiaomi', 164 | Zebra: 'Zebra', 165 | ZTE: 'ZTE' 166 | }; 167 | 168 | const EngineNamesMap = { 169 | Amaya: 'Amaya', 170 | Blink: 'Blink', 171 | EdgeHTML: 'EdgeHTML', 172 | Flow: 'Flow', 173 | Gecko: 'Gecko', 174 | Goanna: 'Goanna', 175 | iCab: 'iCab', 176 | KHTML: 'KHTML', 177 | Links: 'Links', 178 | Lynx: 'Lynx', 179 | NetFront: 'NetFront', 180 | NetSurf: 'NetSurf', 181 | Presto: 'Presto', 182 | Tasman: 'Tasman', 183 | Trident: 'Trident', 184 | w3m: 'w3m', 185 | WebKit: 'WebKit' 186 | }; 187 | const CpuArchMap = { 188 | '68k': '68k', 189 | amd64: 'amd64', 190 | 'arm[64/hf]': 'arm[64/hf]', 191 | avr: 'avr', 192 | 'ia[32/64]': 'ia[32/64]', 193 | 'irix[64]': 'irix[64]', 194 | 'mips[64]': 'mips[64]', 195 | 'pa-risc': 'pa-risc', 196 | ppc: 'ppc', 197 | 'sparc[64]': 'sparc[64]' 198 | }; 199 | 200 | const OsNamesMap = { 201 | AIX: 'AIX', 202 | 'Amiga OS': 'Amiga OS', 203 | 'Android[-x86]': 'Android[-x86]', 204 | Arch: 'Arch', 205 | Bada: 'Bada', 206 | BeOS: 'BeOS', 207 | BlackBerry: 'BlackBerry', 208 | CentOS: 'CentOS', 209 | 'Chromium OS': 'Chromium OS', 210 | Contiki: 'Contiki', 211 | Fedora: 'Fedora', 212 | 'Firefox OS': 'Firefox OS', 213 | FreeBSD: 'FreeBSD', 214 | Debian: 'Debian', 215 | Deepin: 'Deepin', 216 | DragonFly: 'DragonFly', 217 | 'elementary OS': 'elementary OS', 218 | Fuchsia: 'Fuchsia', 219 | Gentoo: 'Gentoo', 220 | GhostBSD: 'GhostBSD', 221 | GNU: 'GNU', 222 | Haiku: 'Haiku', 223 | 'HP-UX': 'HP-UX', 224 | Hurd: 'Hurd', 225 | iOS: 'iOS', 226 | Joli: 'Joli', 227 | KaiOS: 'KaiOS', 228 | Linpus: 'Linpus', 229 | Linspire: 'Linspire', 230 | Linux: 'Linux', 231 | 'Mac OS': 'Mac OS', 232 | Maemo: 'Maemo', 233 | Mageia: 'Mageia', 234 | Mandriva: 'Mandriva', 235 | Manjaro: 'Manjaro', 236 | MeeGo: 'MeeGo', 237 | Minix: 'Minix', 238 | Mint: 'Mint', 239 | 'Morph OS': 'Morph OS', 240 | NetBSD: 'NetBSD', 241 | Nintendo: 'Nintendo', 242 | OpenBSD: 'OpenBSD', 243 | OpenVMS: 'OpenVMS', 244 | 'OS/2': 'OS/2', 245 | Palm: 'Palm', 246 | 'PC-BSD': 'PC-BSD', 247 | PCLinuxOS: 'PCLinuxOS', 248 | Plan9: 'Plan9', 249 | PlayStation: 'PlayStation', 250 | QNX: 'QNX', 251 | Raspbian: 'Raspbian', 252 | RedHat: 'RedHat', 253 | 'RIM Tablet OS': 'RIM Tablet OS', 254 | 'RISC OS': 'RISC OS', 255 | Sabayon: 'Sabayon', 256 | Sailfish: 'Sailfish', 257 | Series40: 'Series40', 258 | Slackware: 'Slackware', 259 | Solaris: 'Solaris', 260 | SUSE: 'SUSE', 261 | Symbian: 'Symbian', 262 | Tizen: 'Tizen', 263 | Ubuntu: 'Ubuntu', 264 | Unix: 'Unix', 265 | VectorLinux: 'VectorLinux', 266 | WebOS: 'WebOS', 267 | 'Windows Mobile': 'Windows Mobile', 268 | 'Windows Phone': 'Windows Phone', 269 | Zenwalk: 'Zenwalk' 270 | }; 271 | -------------------------------------------------------------------------------- /src/lib/core/types.ts: -------------------------------------------------------------------------------- 1 | import { BrowserTypes, DeviceTypes, OsTypes } from '../constants/constants'; 2 | import { getNavigatorInstance, isIOS13Check, setDefaults } from '../utils/utils'; 3 | 4 | const REGEX_CRAWLER = 5 | /Googlebot\/|Googlebot-Mobile|Googlebot-Image|Googlebot-News|Googlebot-Video|AdsBot-Google([^-]|$)|AdsBot-Google-Mobile|Feedfetcher-Google|Mediapartners-Google|Mediapartners \(Googlebot\)|APIs-Google|bingbot|Slurp|[wW]get|LinkedInBot|Python-urllib|python-requests|aiohttp|httpx|libwww-perl|httpunit|nutch|Go-http-client|phpcrawl|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|BIGLOTRON|Teoma|convera|seekbot|Gigabot|Gigablast|exabot|ia_archiver|GingerCrawler|webmon |HTTrack|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|speedy|fluffy|findlink|msrbot|panscient|yacybot|AISearchBot|ips-agent|tagoobot|MJ12bot|woriobot|yanga|buzzbot|mlbot|YandexBot|YandexImages|YandexAccessibilityBot|YandexMobileBot|YandexMetrika|YandexTurbo|YandexImageResizer|YandexVideo|YandexAdNet|YandexBlogs|YandexCalendar|YandexDirect|YandexFavicons|YaDirectFetcher|YandexForDomain|YandexMarket|YandexMedia|YandexMobileScreenShotBot|YandexNews|YandexOntoDB|YandexPagechecker|YandexPartner|YandexRCA|YandexSearchShop|YandexSitelinks|YandexSpravBot|YandexTracker|YandexVertis|YandexVerticals|YandexWebmaster|YandexScreenshotBot|purebot|Linguee Bot|CyberPatrol|voilabot|Baiduspider|citeseerxbot|spbot|twengabot|postrank|TurnitinBot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|sistrix crawler|Ahrefs(Bot|SiteAudit)|fuelbot|CrunchBot|IndeedBot|mappydata|woobot|ZoominfoBot|PrivacyAwareBot|Multiviewbot|SWIMGBot|Grobbot|eright|Apercite|semanticbot|Aboundex|domaincrawler|wbsearchbot|summify|CCBot|edisterbot|seznambot|ec2linkfinder|gslfbot|aiHitBot|intelium_bot|facebookexternalhit|Yeti|RetrevoPageAnalyzer|lb-spider|Sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|it2media-domain-crawler|ip-web-crawler.com|siteexplorer.info|elisabot|proximic|changedetection|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Twitterbot|cXensebot|smtbot|bnf.fr_bot|A6-Indexer|ADmantX|Facebot|OrangeBot\/|memorybot|AdvBot|MegaIndex|SemanticScholarBot|ltx71|nerdybot|xovibot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|findxbot|S[eE][mM]rushBot|yoozBot|lipperhey|Y!J|Domain Re-Animator Bot|AddThis|Screaming Frog SEO Spider|MetaURI|Scrapy|Livelap[bB]ot|OpenHoseBot|CapsuleChecker|collection@infegy.com|IstellaBot|DeuSu\/|betaBot|Cliqzbot\/|MojeekBot\/|netEstate NE Crawler|SafeSearch microdata crawler|Gluten Free Crawler\/|Sonic|Sysomos|Trove|deadlinkchecker|Slack-ImgProxy|Embedly|RankActiveLinkBot|iskanie|SafeDNSBot|SkypeUriPreview|Veoozbot|Slackbot|redditbot|datagnionbot|Google-Adwords-Instant|adbeat_bot|WhatsApp|contxbot|pinterest.com.bot|electricmonk|GarlikCrawler|BingPreview\/|vebidoobot|FemtosearchBot|Yahoo Link Preview|MetaJobBot|DomainStatsBot|mindUpBot|Daum\/|Jugendschutzprogramm-Crawler|Xenu Link Sleuth|Pcore-HTTP|moatbot|KosmioBot|pingdom|AppInsights|PhantomJS|Gowikibot|PiplBot|Discordbot|TelegramBot|Jetslide|newsharecounts|James BOT|Bark[rR]owler|TinEye|SocialRankIOBot|trendictionbot|Ocarinabot|epicbot|Primalbot|DuckDuckGo-Favicons-Bot|GnowitNewsbot|Leikibot|LinkArchiver|YaK\/|PaperLiBot|Digg Deeper|dcrawl|Snacktory|AndersPinkBot|Fyrebot|EveryoneSocialBot|Mediatoolkitbot|Luminator-robots|ExtLinksBot|SurveyBot|NING\/|okhttp|Nuzzel|omgili|PocketParser|YisouSpider|um-LN|ToutiaoSpider|MuckRack|Jamie's Spider|AHC\/|NetcraftSurveyAgent|Laserlikebot|^Apache-HttpClient|AppEngine-Google|Jetty|Upflow|Thinklab|Traackr.com|Twurly|Mastodon|http_get|DnyzBot|botify|007ac9 Crawler|BehloolBot|BrandVerity|check_http|BDCbot|ZumBot|EZID|ICC-Crawler|ArchiveBot|^LCC |filterdb.iss.net\/crawler|BLP_bbot|BomboraBot|Buck\/|Companybook-Crawler|Genieo|magpie-crawler|MeltwaterNews|Moreover|newspaper\/|ScoutJet|(^| )sentry\/|StorygizeBot|UptimeRobot|OutclicksBot|seoscanners|Hatena|Google Web Preview|MauiBot|AlphaBot|SBL-BOT|IAS crawler|adscanner|Netvibes|acapbot|Baidu-YunGuanCe|bitlybot|blogmuraBot|Bot.AraTurka.com|bot-pge.chlooe.com|BoxcarBot|BTWebClient|ContextAd Bot|Digincore bot|Disqus|Feedly|Fetch\/|Fever|Flamingo_SearchEngine|FlipboardProxy|g2reader-bot|G2 Web Services|imrbot|K7MLWCBot|Kemvibot|Landau-Media-Spider|linkapediabot|vkShare|Siteimprove.com|BLEXBot\/|DareBoost|ZuperlistBot\/|Miniflux\/|Feedspot|Diffbot\/|SEOkicks|tracemyfile|Nimbostratus-Bot|zgrab|PR-CY.RU|AdsTxtCrawler|Datafeedwatch|Zabbix|TangibleeBot|google-xrawler|axios|Amazon CloudFront|Pulsepoint|CloudFlare-AlwaysOnline|Google-Structured-Data-Testing-Tool|WordupInfoSearch|WebDataStats|HttpUrlConnection|Seekport Crawler|ZoomBot|VelenPublicWebCrawler|MoodleBot|jpg-newsbot|outbrain|W3C_Validator|Validator\.nu|W3C-checklink|W3C-mobileOK|W3C_I18n-Checker|FeedValidator|W3C_CSS_Validator|W3C_Unicorn|Google-PhysicalWeb|Blackboard|ICBot\/|BazQux|Twingly|Rivva|Experibot|awesomecrawler|Dataprovider.com|GroupHigh\/|theoldreader.com|AnyEvent|Uptimebot\.org|Nmap Scripting Engine|2ip.ru|Clickagy|Caliperbot|MBCrawler|online-webceo-bot|B2B Bot|AddSearchBot|Google Favicon|HubSpot|Chrome-Lighthouse|HeadlessChrome|CheckMarkNetwork\/|www\.uptime\.com|Streamline3Bot\/|serpstatbot\/|MixnodeCache\/|^curl|SimpleScraper|RSSingBot|Jooblebot|fedoraplanet|Friendica|NextCloud|Tiny Tiny RSS|RegionStuttgartBot|Bytespider|Datanyze|Google-Site-Verification|TrendsmapResolver|tweetedtimes|NTENTbot|Gwene|SimplePie|SearchAtlas|Superfeedr|feedbot|UT-Dorkbot|Amazonbot|SerendeputyBot|Eyeotabot|officestorebot|Neticle Crawler|SurdotlyBot|LinkisBot|AwarioSmartBot|AwarioRssBot|RyteBot|FreeWebMonitoring SiteChecker|AspiegelBot|NAVER Blog Rssbot|zenback bot|SentiBot|Domains Project\/|Pandalytics|VKRobot|bidswitchbot|tigerbot|NIXStatsbot|Atom Feed Robot|Curebot|PagePeeker\/|Vigil\/|rssbot\/|startmebot\/|JobboerseBot|seewithkids|NINJA bot|Cutbot|BublupBot|BrandONbot|RidderBot|Taboolabot|Dubbotbot|FindITAnswersbot|infoobot|Refindbot|BlogTraffic\/\d\.\d+ Feed-Fetcher|SeobilityBot|Cincraw|Dragonbot|VoluumDSP-content-bot|FreshRSS|BitBot|^PHP-Curl-Class|Google-Certificates-Bridge/; 6 | 7 | // device types 8 | export const isMobileType = ({ type }) => type === DeviceTypes.Mobile; 9 | export const isTabletType = ({ type }) => type === DeviceTypes.Tablet; 10 | export const isMobileAndTabletType = ({ type }) => 11 | type === DeviceTypes.Mobile || type === DeviceTypes.Tablet; 12 | export const isSmartTVType = ({ type }) => type === DeviceTypes.SmartTv; 13 | export const isBrowserType = ({ type }) => type === DeviceTypes.Browser; 14 | export const isWearableType = ({ type }) => type === DeviceTypes.Wearable; 15 | export const isConsoleType = ({ type }) => type === DeviceTypes.Console; 16 | export const isEmbeddedType = ({ type }) => type === DeviceTypes.Embedded; 17 | export const getMobileVendor = ({ vendor }) => setDefaults(vendor); 18 | export const getMobileModel = ({ model }) => setDefaults(model); 19 | export const getDeviceType = ({ type }) => setDefaults(type, 'browser'); 20 | 21 | // os types 22 | export const isAndroidType = ({ name }) => name === OsTypes.Android; 23 | export const isWindowsType = ({ name }) => name === OsTypes.Windows; 24 | export const isMacOsType = ({ name }) => name === OsTypes.MAC_OS; 25 | export const isWinPhoneType = ({ name }) => name === OsTypes.WindowsPhone; 26 | export const isIOSType = ({ name }) => name === OsTypes.IOS; 27 | export const getOsVersion = ({ version }) => setDefaults(version); 28 | export const getOsName = ({ name }) => setDefaults(name); 29 | 30 | // browser types 31 | export const isChromeType = ({ name }) => name === BrowserTypes.Chrome; 32 | export const isFirefoxType = ({ name }) => name === BrowserTypes.Firefox; 33 | export const isChromiumType = ({ name }) => name === BrowserTypes.Chromium; 34 | export const isEdgeType = ({ name }) => name === BrowserTypes.Edge; 35 | export const isYandexType = ({ name }) => name === BrowserTypes.Yandex; 36 | export const isSafariType = ({ name }) => 37 | name === BrowserTypes.Safari || name === BrowserTypes.MobileSafari; 38 | export const isMobileSafariType = ({ name }) => name === BrowserTypes.MobileSafari; 39 | export const isOperaType = ({ name }) => name === BrowserTypes.Opera; 40 | export const isIEType = ({ name }) => 41 | name === BrowserTypes.InternetExplorer || name === BrowserTypes.Ie; 42 | export const isMIUIType = ({ name }) => name === BrowserTypes.MIUI; 43 | export const isSamsungBrowserType = ({ name }) => name === BrowserTypes.SamsungBrowser; 44 | export const getBrowserFullVersion = ({ version }) => setDefaults(version); 45 | export const getBrowserVersion = ({ major }) => setDefaults(major); 46 | export const getBrowserName = ({ name }) => setDefaults(name); 47 | 48 | // engine types 49 | export const getEngineName = ({ name }) => setDefaults(name); 50 | export const getEngineVersion = ({ version }) => setDefaults(version); 51 | 52 | export const isElectronType = () => { 53 | const nav = getNavigatorInstance(); 54 | const ua = nav && nav.userAgent && nav.userAgent.toLowerCase(); 55 | 56 | return typeof ua === 'string' ? /electron/.test(ua) : false; 57 | }; 58 | export const isEdgeChromiumType = (ua) => typeof ua === 'string' && ua.indexOf('Edg/') !== -1; 59 | 60 | export const getIOS13 = () => { 61 | const nav = getNavigatorInstance(); 62 | return ( 63 | nav && 64 | (/iPad|iPhone|iPod/.test(nav.platform) || 65 | (nav.platform === 'MacIntel' && nav.maxTouchPoints > 0)) 66 | ); 67 | }; 68 | 69 | export const isWebview = (userAg: string) => { 70 | const userAgent = userAg.toLowerCase(); 71 | const safari = /safari/.test(userAgent); 72 | const ios = /iphone|ipod|ipad/.test(userAgent); 73 | 74 | if (ios) { 75 | return !safari; 76 | } else { 77 | return userAgent.includes('wv'); 78 | } 79 | }; 80 | 81 | export const isCrawler = (userAg: string) => REGEX_CRAWLER.test(userAg); 82 | export const getIPad13 = () => isIOS13Check('iPad'); 83 | export const getIphone13 = () => isIOS13Check('iPhone'); 84 | export const getIPod13 = () => isIOS13Check('iPod'); 85 | export const getUseragent = (userAg: string) => setDefaults(userAg); 86 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | ua-parser-js: 12 | specifier: ^1.0.35 13 | version: 1.0.35 14 | devDependencies: 15 | '@playwright/test': 16 | specifier: ^1.28.1 17 | version: 1.32.3 18 | '@sveltejs/adapter-auto': 19 | specifier: ^2.0.0 20 | version: 2.0.0(@sveltejs/kit@1.15.5) 21 | '@sveltejs/kit': 22 | specifier: ^1.5.0 23 | version: 1.15.5(svelte@3.58.0)(vite@4.2.1) 24 | '@sveltejs/package': 25 | specifier: ^2.0.0 26 | version: 2.0.2(svelte@3.58.0)(typescript@5.0.4) 27 | '@types/ua-parser-js': 28 | specifier: ^0.7.36 29 | version: 0.7.36 30 | '@typescript-eslint/eslint-plugin': 31 | specifier: ^5.45.0 32 | version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@5.0.4) 33 | '@typescript-eslint/parser': 34 | specifier: ^5.45.0 35 | version: 5.58.0(eslint@8.38.0)(typescript@5.0.4) 36 | eslint: 37 | specifier: ^8.28.0 38 | version: 8.38.0 39 | eslint-config-prettier: 40 | specifier: ^8.5.0 41 | version: 8.8.0(eslint@8.38.0) 42 | eslint-plugin-svelte3: 43 | specifier: ^4.0.0 44 | version: 4.0.0(eslint@8.38.0)(svelte@3.58.0) 45 | prettier: 46 | specifier: ^2.8.0 47 | version: 2.8.7 48 | prettier-plugin-svelte: 49 | specifier: ^2.8.1 50 | version: 2.10.0(prettier@2.8.7)(svelte@3.58.0) 51 | publint: 52 | specifier: ^0.1.9 53 | version: 0.1.11 54 | svelte: 55 | specifier: ^3.54.0 56 | version: 3.58.0 57 | svelte-check: 58 | specifier: ^3.0.1 59 | version: 3.2.0(svelte@3.58.0) 60 | tslib: 61 | specifier: ^2.4.1 62 | version: 2.5.0 63 | typescript: 64 | specifier: ^5.0.0 65 | version: 5.0.4 66 | vite: 67 | specifier: ^4.2.0 68 | version: 4.2.1(@types/node@18.15.11) 69 | vitest: 70 | specifier: ^0.25.3 71 | version: 0.25.8 72 | 73 | packages: 74 | 75 | '@esbuild/android-arm64@0.17.16': 76 | resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} 77 | engines: {node: '>=12'} 78 | cpu: [arm64] 79 | os: [android] 80 | 81 | '@esbuild/android-arm@0.17.16': 82 | resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} 83 | engines: {node: '>=12'} 84 | cpu: [arm] 85 | os: [android] 86 | 87 | '@esbuild/android-x64@0.17.16': 88 | resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} 89 | engines: {node: '>=12'} 90 | cpu: [x64] 91 | os: [android] 92 | 93 | '@esbuild/darwin-arm64@0.17.16': 94 | resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} 95 | engines: {node: '>=12'} 96 | cpu: [arm64] 97 | os: [darwin] 98 | 99 | '@esbuild/darwin-x64@0.17.16': 100 | resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} 101 | engines: {node: '>=12'} 102 | cpu: [x64] 103 | os: [darwin] 104 | 105 | '@esbuild/freebsd-arm64@0.17.16': 106 | resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} 107 | engines: {node: '>=12'} 108 | cpu: [arm64] 109 | os: [freebsd] 110 | 111 | '@esbuild/freebsd-x64@0.17.16': 112 | resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} 113 | engines: {node: '>=12'} 114 | cpu: [x64] 115 | os: [freebsd] 116 | 117 | '@esbuild/linux-arm64@0.17.16': 118 | resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} 119 | engines: {node: '>=12'} 120 | cpu: [arm64] 121 | os: [linux] 122 | 123 | '@esbuild/linux-arm@0.17.16': 124 | resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} 125 | engines: {node: '>=12'} 126 | cpu: [arm] 127 | os: [linux] 128 | 129 | '@esbuild/linux-ia32@0.17.16': 130 | resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} 131 | engines: {node: '>=12'} 132 | cpu: [ia32] 133 | os: [linux] 134 | 135 | '@esbuild/linux-loong64@0.17.16': 136 | resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} 137 | engines: {node: '>=12'} 138 | cpu: [loong64] 139 | os: [linux] 140 | 141 | '@esbuild/linux-mips64el@0.17.16': 142 | resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} 143 | engines: {node: '>=12'} 144 | cpu: [mips64el] 145 | os: [linux] 146 | 147 | '@esbuild/linux-ppc64@0.17.16': 148 | resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} 149 | engines: {node: '>=12'} 150 | cpu: [ppc64] 151 | os: [linux] 152 | 153 | '@esbuild/linux-riscv64@0.17.16': 154 | resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} 155 | engines: {node: '>=12'} 156 | cpu: [riscv64] 157 | os: [linux] 158 | 159 | '@esbuild/linux-s390x@0.17.16': 160 | resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} 161 | engines: {node: '>=12'} 162 | cpu: [s390x] 163 | os: [linux] 164 | 165 | '@esbuild/linux-x64@0.17.16': 166 | resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} 167 | engines: {node: '>=12'} 168 | cpu: [x64] 169 | os: [linux] 170 | 171 | '@esbuild/netbsd-x64@0.17.16': 172 | resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} 173 | engines: {node: '>=12'} 174 | cpu: [x64] 175 | os: [netbsd] 176 | 177 | '@esbuild/openbsd-x64@0.17.16': 178 | resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} 179 | engines: {node: '>=12'} 180 | cpu: [x64] 181 | os: [openbsd] 182 | 183 | '@esbuild/sunos-x64@0.17.16': 184 | resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} 185 | engines: {node: '>=12'} 186 | cpu: [x64] 187 | os: [sunos] 188 | 189 | '@esbuild/win32-arm64@0.17.16': 190 | resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} 191 | engines: {node: '>=12'} 192 | cpu: [arm64] 193 | os: [win32] 194 | 195 | '@esbuild/win32-ia32@0.17.16': 196 | resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} 197 | engines: {node: '>=12'} 198 | cpu: [ia32] 199 | os: [win32] 200 | 201 | '@esbuild/win32-x64@0.17.16': 202 | resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} 203 | engines: {node: '>=12'} 204 | cpu: [x64] 205 | os: [win32] 206 | 207 | '@eslint-community/eslint-utils@4.4.0': 208 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 209 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 210 | peerDependencies: 211 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 212 | 213 | '@eslint-community/regexpp@4.5.0': 214 | resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} 215 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 216 | 217 | '@eslint/eslintrc@2.0.2': 218 | resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} 219 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 220 | 221 | '@eslint/js@8.38.0': 222 | resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} 223 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 224 | 225 | '@humanwhocodes/config-array@0.11.8': 226 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 227 | engines: {node: '>=10.10.0'} 228 | 229 | '@humanwhocodes/module-importer@1.0.1': 230 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 231 | engines: {node: '>=12.22'} 232 | 233 | '@humanwhocodes/object-schema@1.2.1': 234 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 235 | 236 | '@jridgewell/resolve-uri@3.1.0': 237 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 238 | engines: {node: '>=6.0.0'} 239 | 240 | '@jridgewell/sourcemap-codec@1.4.14': 241 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 242 | 243 | '@jridgewell/sourcemap-codec@1.4.15': 244 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 245 | 246 | '@jridgewell/trace-mapping@0.3.18': 247 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} 248 | 249 | '@nodelib/fs.scandir@2.1.5': 250 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 251 | engines: {node: '>= 8'} 252 | 253 | '@nodelib/fs.stat@2.0.5': 254 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 255 | engines: {node: '>= 8'} 256 | 257 | '@nodelib/fs.walk@1.2.8': 258 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 259 | engines: {node: '>= 8'} 260 | 261 | '@playwright/test@1.32.3': 262 | resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} 263 | engines: {node: '>=14'} 264 | hasBin: true 265 | 266 | '@polka/url@1.0.0-next.21': 267 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 268 | 269 | '@sveltejs/adapter-auto@2.0.0': 270 | resolution: {integrity: sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==} 271 | peerDependencies: 272 | '@sveltejs/kit': ^1.0.0 273 | 274 | '@sveltejs/kit@1.15.5': 275 | resolution: {integrity: sha512-NyNtgIJBNo3AXMkl0iN10VrKgQS6VM6E+rcqZnZMn12dOo7SwFflj1du0ZgXNCZ1tx6VuEpSz9+FpPjswr4gEg==} 276 | engines: {node: ^16.14 || >=18} 277 | hasBin: true 278 | peerDependencies: 279 | svelte: ^3.54.0 280 | vite: ^4.0.0 281 | 282 | '@sveltejs/package@2.0.2': 283 | resolution: {integrity: sha512-cCOCcO8yMHnhHyaR51nQtvKZ3o/vSU9UYI1EXLT1j2CKNPMuH1/g6JNwKcNNrtQGwwquudc69ZeYy8D/TDNwEw==} 284 | engines: {node: ^16.14 || >=18} 285 | hasBin: true 286 | peerDependencies: 287 | svelte: ^3.44.0 288 | 289 | '@sveltejs/vite-plugin-svelte@2.0.4': 290 | resolution: {integrity: sha512-pjqhW00KwK2uzDGEr+yJBwut+D+4XfJO/+bHHdHzPRXn9+1Jeq5JcFHyrUiYaXgHtyhX0RsllCTm4ssAx4ZY7Q==} 291 | engines: {node: ^14.18.0 || >= 16} 292 | peerDependencies: 293 | svelte: ^3.54.0 294 | vite: ^4.0.0 295 | 296 | '@types/chai-subset@1.3.3': 297 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 298 | 299 | '@types/chai@4.3.4': 300 | resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} 301 | 302 | '@types/cookie@0.5.1': 303 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 304 | 305 | '@types/json-schema@7.0.11': 306 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 307 | 308 | '@types/node@18.15.11': 309 | resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} 310 | 311 | '@types/pug@2.0.6': 312 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 313 | 314 | '@types/semver@7.3.13': 315 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 316 | 317 | '@types/ua-parser-js@0.7.36': 318 | resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} 319 | 320 | '@typescript-eslint/eslint-plugin@5.58.0': 321 | resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} 322 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 323 | peerDependencies: 324 | '@typescript-eslint/parser': ^5.0.0 325 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 326 | typescript: '*' 327 | peerDependenciesMeta: 328 | typescript: 329 | optional: true 330 | 331 | '@typescript-eslint/parser@5.58.0': 332 | resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} 333 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 334 | peerDependencies: 335 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 336 | typescript: '*' 337 | peerDependenciesMeta: 338 | typescript: 339 | optional: true 340 | 341 | '@typescript-eslint/scope-manager@5.58.0': 342 | resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} 343 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 344 | 345 | '@typescript-eslint/type-utils@5.58.0': 346 | resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} 347 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 348 | peerDependencies: 349 | eslint: '*' 350 | typescript: '*' 351 | peerDependenciesMeta: 352 | typescript: 353 | optional: true 354 | 355 | '@typescript-eslint/types@5.58.0': 356 | resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} 357 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 358 | 359 | '@typescript-eslint/typescript-estree@5.58.0': 360 | resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} 361 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 362 | peerDependencies: 363 | typescript: '*' 364 | peerDependenciesMeta: 365 | typescript: 366 | optional: true 367 | 368 | '@typescript-eslint/utils@5.58.0': 369 | resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} 370 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 371 | peerDependencies: 372 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 373 | 374 | '@typescript-eslint/visitor-keys@5.58.0': 375 | resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} 376 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 377 | 378 | acorn-jsx@5.3.2: 379 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 380 | peerDependencies: 381 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 382 | 383 | acorn-walk@8.2.0: 384 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 385 | engines: {node: '>=0.4.0'} 386 | 387 | acorn@8.8.2: 388 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 389 | engines: {node: '>=0.4.0'} 390 | hasBin: true 391 | 392 | ajv@6.12.6: 393 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 394 | 395 | ansi-regex@5.0.1: 396 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 397 | engines: {node: '>=8'} 398 | 399 | ansi-styles@4.3.0: 400 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 401 | engines: {node: '>=8'} 402 | 403 | anymatch@3.1.3: 404 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 405 | engines: {node: '>= 8'} 406 | 407 | argparse@2.0.1: 408 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 409 | 410 | array-union@2.1.0: 411 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 412 | engines: {node: '>=8'} 413 | 414 | assertion-error@1.1.0: 415 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 416 | 417 | balanced-match@1.0.2: 418 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 419 | 420 | binary-extensions@2.2.0: 421 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 422 | engines: {node: '>=8'} 423 | 424 | brace-expansion@1.1.11: 425 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 426 | 427 | brace-expansion@2.0.1: 428 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 429 | 430 | braces@3.0.2: 431 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 432 | engines: {node: '>=8'} 433 | 434 | buffer-crc32@0.2.13: 435 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 436 | 437 | busboy@1.6.0: 438 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 439 | engines: {node: '>=10.16.0'} 440 | 441 | callsites@3.1.0: 442 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 443 | engines: {node: '>=6'} 444 | 445 | chai@4.3.7: 446 | resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} 447 | engines: {node: '>=4'} 448 | 449 | chalk@4.1.2: 450 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 451 | engines: {node: '>=10'} 452 | 453 | check-error@1.0.2: 454 | resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} 455 | 456 | chokidar@3.5.3: 457 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 458 | engines: {node: '>= 8.10.0'} 459 | 460 | color-convert@2.0.1: 461 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 462 | engines: {node: '>=7.0.0'} 463 | 464 | color-name@1.1.4: 465 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 466 | 467 | concat-map@0.0.1: 468 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 469 | 470 | cookie@0.5.0: 471 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 472 | engines: {node: '>= 0.6'} 473 | 474 | cross-spawn@7.0.3: 475 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 476 | engines: {node: '>= 8'} 477 | 478 | debug@4.3.4: 479 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 480 | engines: {node: '>=6.0'} 481 | peerDependencies: 482 | supports-color: '*' 483 | peerDependenciesMeta: 484 | supports-color: 485 | optional: true 486 | 487 | dedent-js@1.0.1: 488 | resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 489 | 490 | deep-eql@4.1.3: 491 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 492 | engines: {node: '>=6'} 493 | 494 | deep-is@0.1.4: 495 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 496 | 497 | deepmerge@4.3.1: 498 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 499 | engines: {node: '>=0.10.0'} 500 | 501 | detect-indent@6.1.0: 502 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 503 | engines: {node: '>=8'} 504 | 505 | devalue@4.3.0: 506 | resolution: {integrity: sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==} 507 | 508 | dir-glob@3.0.1: 509 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 510 | engines: {node: '>=8'} 511 | 512 | doctrine@3.0.0: 513 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 514 | engines: {node: '>=6.0.0'} 515 | 516 | es6-promise@3.3.1: 517 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 518 | 519 | esbuild@0.17.16: 520 | resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} 521 | engines: {node: '>=12'} 522 | hasBin: true 523 | 524 | escape-string-regexp@4.0.0: 525 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 526 | engines: {node: '>=10'} 527 | 528 | eslint-config-prettier@8.8.0: 529 | resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} 530 | hasBin: true 531 | peerDependencies: 532 | eslint: '>=7.0.0' 533 | 534 | eslint-plugin-svelte3@4.0.0: 535 | resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} 536 | peerDependencies: 537 | eslint: '>=8.0.0' 538 | svelte: ^3.2.0 539 | 540 | eslint-scope@5.1.1: 541 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 542 | engines: {node: '>=8.0.0'} 543 | 544 | eslint-scope@7.2.0: 545 | resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} 546 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 547 | 548 | eslint-visitor-keys@3.4.0: 549 | resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} 550 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 551 | 552 | eslint@8.38.0: 553 | resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} 554 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 555 | hasBin: true 556 | 557 | esm-env@1.0.0: 558 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 559 | 560 | espree@9.5.1: 561 | resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} 562 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 563 | 564 | esquery@1.5.0: 565 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 566 | engines: {node: '>=0.10'} 567 | 568 | esrecurse@4.3.0: 569 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 570 | engines: {node: '>=4.0'} 571 | 572 | estraverse@4.3.0: 573 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 574 | engines: {node: '>=4.0'} 575 | 576 | estraverse@5.3.0: 577 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 578 | engines: {node: '>=4.0'} 579 | 580 | esutils@2.0.3: 581 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 582 | engines: {node: '>=0.10.0'} 583 | 584 | fast-deep-equal@3.1.3: 585 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 586 | 587 | fast-glob@3.2.12: 588 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 589 | engines: {node: '>=8.6.0'} 590 | 591 | fast-json-stable-stringify@2.1.0: 592 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 593 | 594 | fast-levenshtein@2.0.6: 595 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 596 | 597 | fastq@1.15.0: 598 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 599 | 600 | file-entry-cache@6.0.1: 601 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 602 | engines: {node: ^10.12.0 || >=12.0.0} 603 | 604 | fill-range@7.0.1: 605 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 606 | engines: {node: '>=8'} 607 | 608 | find-up@5.0.0: 609 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 610 | engines: {node: '>=10'} 611 | 612 | flat-cache@3.0.4: 613 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 614 | engines: {node: ^10.12.0 || >=12.0.0} 615 | 616 | flatted@3.2.7: 617 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 618 | 619 | fs.realpath@1.0.0: 620 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 621 | 622 | fsevents@2.3.2: 623 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 624 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 625 | os: [darwin] 626 | 627 | function-bind@1.1.1: 628 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 629 | 630 | get-func-name@2.0.0: 631 | resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} 632 | 633 | glob-parent@5.1.2: 634 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 635 | engines: {node: '>= 6'} 636 | 637 | glob-parent@6.0.2: 638 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 639 | engines: {node: '>=10.13.0'} 640 | 641 | glob@7.2.3: 642 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 643 | 644 | glob@8.1.0: 645 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 646 | engines: {node: '>=12'} 647 | 648 | globals@13.20.0: 649 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 650 | engines: {node: '>=8'} 651 | 652 | globalyzer@0.1.0: 653 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 654 | 655 | globby@11.1.0: 656 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 657 | engines: {node: '>=10'} 658 | 659 | globrex@0.1.2: 660 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 661 | 662 | graceful-fs@4.2.11: 663 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 664 | 665 | grapheme-splitter@1.0.4: 666 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 667 | 668 | has-flag@4.0.0: 669 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 670 | engines: {node: '>=8'} 671 | 672 | has@1.0.3: 673 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 674 | engines: {node: '>= 0.4.0'} 675 | 676 | ignore-walk@5.0.1: 677 | resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} 678 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 679 | 680 | ignore@5.2.4: 681 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 682 | engines: {node: '>= 4'} 683 | 684 | import-fresh@3.3.0: 685 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 686 | engines: {node: '>=6'} 687 | 688 | import-meta-resolve@2.2.2: 689 | resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} 690 | 691 | imurmurhash@0.1.4: 692 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 693 | engines: {node: '>=0.8.19'} 694 | 695 | inflight@1.0.6: 696 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 697 | 698 | inherits@2.0.4: 699 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 700 | 701 | is-binary-path@2.1.0: 702 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 703 | engines: {node: '>=8'} 704 | 705 | is-core-module@2.12.0: 706 | resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} 707 | 708 | is-extglob@2.1.1: 709 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 710 | engines: {node: '>=0.10.0'} 711 | 712 | is-glob@4.0.3: 713 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 714 | engines: {node: '>=0.10.0'} 715 | 716 | is-number@7.0.0: 717 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 718 | engines: {node: '>=0.12.0'} 719 | 720 | is-path-inside@3.0.3: 721 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 722 | engines: {node: '>=8'} 723 | 724 | isexe@2.0.0: 725 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 726 | 727 | js-sdsl@4.4.0: 728 | resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} 729 | 730 | js-yaml@4.1.0: 731 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 732 | hasBin: true 733 | 734 | json-schema-traverse@0.4.1: 735 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 736 | 737 | json-stable-stringify-without-jsonify@1.0.1: 738 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 739 | 740 | kleur@4.1.5: 741 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 742 | engines: {node: '>=6'} 743 | 744 | levn@0.4.1: 745 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 746 | engines: {node: '>= 0.8.0'} 747 | 748 | local-pkg@0.4.3: 749 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 750 | engines: {node: '>=14'} 751 | 752 | locate-path@6.0.0: 753 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 754 | engines: {node: '>=10'} 755 | 756 | lodash.merge@4.6.2: 757 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 758 | 759 | loupe@2.3.6: 760 | resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} 761 | 762 | lower-case@2.0.2: 763 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 764 | 765 | lru-cache@6.0.0: 766 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 767 | engines: {node: '>=10'} 768 | 769 | magic-string@0.27.0: 770 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 771 | engines: {node: '>=12'} 772 | 773 | magic-string@0.30.0: 774 | resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} 775 | engines: {node: '>=12'} 776 | 777 | merge2@1.4.1: 778 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 779 | engines: {node: '>= 8'} 780 | 781 | micromatch@4.0.5: 782 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 783 | engines: {node: '>=8.6'} 784 | 785 | mime@3.0.0: 786 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 787 | engines: {node: '>=10.0.0'} 788 | hasBin: true 789 | 790 | min-indent@1.0.1: 791 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 792 | engines: {node: '>=4'} 793 | 794 | minimatch@3.1.2: 795 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 796 | 797 | minimatch@5.1.6: 798 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 799 | engines: {node: '>=10'} 800 | 801 | minimist@1.2.8: 802 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 803 | 804 | mkdirp@0.5.6: 805 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 806 | hasBin: true 807 | 808 | mri@1.2.0: 809 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 810 | engines: {node: '>=4'} 811 | 812 | mrmime@1.0.1: 813 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 814 | engines: {node: '>=10'} 815 | 816 | ms@2.1.2: 817 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 818 | 819 | nanoid@3.3.6: 820 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 821 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 822 | hasBin: true 823 | 824 | natural-compare-lite@1.4.0: 825 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 826 | 827 | natural-compare@1.4.0: 828 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 829 | 830 | no-case@3.0.4: 831 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 832 | 833 | normalize-path@3.0.0: 834 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 835 | engines: {node: '>=0.10.0'} 836 | 837 | npm-bundled@2.0.1: 838 | resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} 839 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 840 | 841 | npm-normalize-package-bin@2.0.0: 842 | resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} 843 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 844 | 845 | npm-packlist@5.1.3: 846 | resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} 847 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 848 | hasBin: true 849 | 850 | once@1.4.0: 851 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 852 | 853 | optionator@0.9.1: 854 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 855 | engines: {node: '>= 0.8.0'} 856 | 857 | p-limit@3.1.0: 858 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 859 | engines: {node: '>=10'} 860 | 861 | p-locate@5.0.0: 862 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 863 | engines: {node: '>=10'} 864 | 865 | parent-module@1.0.1: 866 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 867 | engines: {node: '>=6'} 868 | 869 | pascal-case@3.1.2: 870 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 871 | 872 | path-exists@4.0.0: 873 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 874 | engines: {node: '>=8'} 875 | 876 | path-is-absolute@1.0.1: 877 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 878 | engines: {node: '>=0.10.0'} 879 | 880 | path-key@3.1.1: 881 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 882 | engines: {node: '>=8'} 883 | 884 | path-parse@1.0.7: 885 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 886 | 887 | path-type@4.0.0: 888 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 889 | engines: {node: '>=8'} 890 | 891 | pathval@1.1.1: 892 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 893 | 894 | picocolors@1.0.0: 895 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 896 | 897 | picomatch@2.3.1: 898 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 899 | engines: {node: '>=8.6'} 900 | 901 | playwright-core@1.32.3: 902 | resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} 903 | engines: {node: '>=14'} 904 | hasBin: true 905 | 906 | postcss@8.4.21: 907 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 908 | engines: {node: ^10 || ^12 || >=14} 909 | 910 | prelude-ls@1.2.1: 911 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 912 | engines: {node: '>= 0.8.0'} 913 | 914 | prettier-plugin-svelte@2.10.0: 915 | resolution: {integrity: sha512-GXMY6t86thctyCvQq+jqElO+MKdB09BkL3hexyGP3Oi8XLKRFaJP1ud/xlWCZ9ZIa2BxHka32zhHfcuU+XsRQg==} 916 | peerDependencies: 917 | prettier: ^1.16.4 || ^2.0.0 918 | svelte: ^3.2.0 919 | 920 | prettier@2.8.7: 921 | resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} 922 | engines: {node: '>=10.13.0'} 923 | hasBin: true 924 | 925 | publint@0.1.11: 926 | resolution: {integrity: sha512-sD0rtIEadks83MkpomJswBO/YHExJLkta1TyqUhb0/aVV+o3ZlVnwsDPjCAow8tpfxmLGutCSLWq32yfhPB98w==} 927 | engines: {node: '>=16'} 928 | hasBin: true 929 | 930 | punycode@2.3.0: 931 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 932 | engines: {node: '>=6'} 933 | 934 | queue-microtask@1.2.3: 935 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 936 | 937 | readdirp@3.6.0: 938 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 939 | engines: {node: '>=8.10.0'} 940 | 941 | resolve-from@4.0.0: 942 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 943 | engines: {node: '>=4'} 944 | 945 | resolve@1.22.3: 946 | resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} 947 | hasBin: true 948 | 949 | reusify@1.0.4: 950 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 951 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 952 | 953 | rimraf@2.7.1: 954 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 955 | hasBin: true 956 | 957 | rimraf@3.0.2: 958 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 959 | hasBin: true 960 | 961 | rollup@3.20.2: 962 | resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} 963 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 964 | hasBin: true 965 | 966 | run-parallel@1.2.0: 967 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 968 | 969 | sade@1.8.1: 970 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 971 | engines: {node: '>=6'} 972 | 973 | sander@0.5.1: 974 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 975 | 976 | semver@7.4.0: 977 | resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} 978 | engines: {node: '>=10'} 979 | hasBin: true 980 | 981 | set-cookie-parser@2.6.0: 982 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 983 | 984 | shebang-command@2.0.0: 985 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 986 | engines: {node: '>=8'} 987 | 988 | shebang-regex@3.0.0: 989 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 990 | engines: {node: '>=8'} 991 | 992 | sirv@2.0.2: 993 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 994 | engines: {node: '>= 10'} 995 | 996 | slash@3.0.0: 997 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 998 | engines: {node: '>=8'} 999 | 1000 | sorcery@0.11.0: 1001 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 1002 | hasBin: true 1003 | 1004 | source-map-js@1.0.2: 1005 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1006 | engines: {node: '>=0.10.0'} 1007 | 1008 | source-map@0.6.1: 1009 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1010 | engines: {node: '>=0.10.0'} 1011 | 1012 | streamsearch@1.1.0: 1013 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1014 | engines: {node: '>=10.0.0'} 1015 | 1016 | strip-ansi@6.0.1: 1017 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1018 | engines: {node: '>=8'} 1019 | 1020 | strip-indent@3.0.0: 1021 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1022 | engines: {node: '>=8'} 1023 | 1024 | strip-json-comments@3.1.1: 1025 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1026 | engines: {node: '>=8'} 1027 | 1028 | strip-literal@1.0.1: 1029 | resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} 1030 | 1031 | supports-color@7.2.0: 1032 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1033 | engines: {node: '>=8'} 1034 | 1035 | supports-preserve-symlinks-flag@1.0.0: 1036 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1037 | engines: {node: '>= 0.4'} 1038 | 1039 | svelte-check@3.2.0: 1040 | resolution: {integrity: sha512-6ZnscN8dHEN5Eq5LgIzjj07W9nc9myyBH+diXsUAuiY/3rt0l65/LCIQYlIuoFEjp2F1NhXqZiJwV9omPj9tMw==} 1041 | hasBin: true 1042 | peerDependencies: 1043 | svelte: ^3.55.0 1044 | 1045 | svelte-hmr@0.15.1: 1046 | resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} 1047 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1048 | peerDependencies: 1049 | svelte: '>=3.19.0' 1050 | 1051 | svelte-preprocess@5.0.3: 1052 | resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} 1053 | engines: {node: '>= 14.10.0'} 1054 | peerDependencies: 1055 | '@babel/core': ^7.10.2 1056 | coffeescript: ^2.5.1 1057 | less: ^3.11.3 || ^4.0.0 1058 | postcss: ^7 || ^8 1059 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 1060 | pug: ^3.0.0 1061 | sass: ^1.26.8 1062 | stylus: ^0.55.0 1063 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1064 | svelte: ^3.23.0 1065 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 1066 | peerDependenciesMeta: 1067 | '@babel/core': 1068 | optional: true 1069 | coffeescript: 1070 | optional: true 1071 | less: 1072 | optional: true 1073 | postcss: 1074 | optional: true 1075 | postcss-load-config: 1076 | optional: true 1077 | pug: 1078 | optional: true 1079 | sass: 1080 | optional: true 1081 | stylus: 1082 | optional: true 1083 | sugarss: 1084 | optional: true 1085 | typescript: 1086 | optional: true 1087 | 1088 | svelte2tsx@0.6.11: 1089 | resolution: {integrity: sha512-rRW/3V/6mcejYWmSqcHpmILOSPsOhLgkbKbrTOz82s2n8TywmIsqj2jYPsiL6HeGoUM/atiTD0YKguW4b7ECog==} 1090 | peerDependencies: 1091 | svelte: ^3.55 1092 | typescript: ^4.9.4 || ^5.0.0 1093 | 1094 | svelte@3.58.0: 1095 | resolution: {integrity: sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==} 1096 | engines: {node: '>= 8'} 1097 | 1098 | text-table@0.2.0: 1099 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1100 | 1101 | tiny-glob@0.2.9: 1102 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1103 | 1104 | tinybench@2.4.0: 1105 | resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} 1106 | 1107 | tinypool@0.3.1: 1108 | resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} 1109 | engines: {node: '>=14.0.0'} 1110 | 1111 | tinyspy@1.1.1: 1112 | resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} 1113 | engines: {node: '>=14.0.0'} 1114 | 1115 | to-regex-range@5.0.1: 1116 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1117 | engines: {node: '>=8.0'} 1118 | 1119 | totalist@3.0.1: 1120 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1121 | engines: {node: '>=6'} 1122 | 1123 | tslib@1.14.1: 1124 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1125 | 1126 | tslib@2.5.0: 1127 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 1128 | 1129 | tsutils@3.21.0: 1130 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1131 | engines: {node: '>= 6'} 1132 | peerDependencies: 1133 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 1134 | 1135 | type-check@0.4.0: 1136 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1137 | engines: {node: '>= 0.8.0'} 1138 | 1139 | type-detect@4.0.8: 1140 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1141 | engines: {node: '>=4'} 1142 | 1143 | type-fest@0.20.2: 1144 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1145 | engines: {node: '>=10'} 1146 | 1147 | typescript@5.0.4: 1148 | resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} 1149 | engines: {node: '>=12.20'} 1150 | hasBin: true 1151 | 1152 | ua-parser-js@1.0.35: 1153 | resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} 1154 | 1155 | undici@5.20.0: 1156 | resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} 1157 | engines: {node: '>=12.18'} 1158 | 1159 | uri-js@4.4.1: 1160 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1161 | 1162 | vite@4.2.1: 1163 | resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} 1164 | engines: {node: ^14.18.0 || >=16.0.0} 1165 | hasBin: true 1166 | peerDependencies: 1167 | '@types/node': '>= 14' 1168 | less: '*' 1169 | sass: '*' 1170 | stylus: '*' 1171 | sugarss: '*' 1172 | terser: ^5.4.0 1173 | peerDependenciesMeta: 1174 | '@types/node': 1175 | optional: true 1176 | less: 1177 | optional: true 1178 | sass: 1179 | optional: true 1180 | stylus: 1181 | optional: true 1182 | sugarss: 1183 | optional: true 1184 | terser: 1185 | optional: true 1186 | 1187 | vitefu@0.2.4: 1188 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 1189 | peerDependencies: 1190 | vite: ^3.0.0 || ^4.0.0 1191 | peerDependenciesMeta: 1192 | vite: 1193 | optional: true 1194 | 1195 | vitest@0.25.8: 1196 | resolution: {integrity: sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==} 1197 | engines: {node: '>=v14.16.0'} 1198 | hasBin: true 1199 | peerDependencies: 1200 | '@edge-runtime/vm': '*' 1201 | '@vitest/browser': '*' 1202 | '@vitest/ui': '*' 1203 | happy-dom: '*' 1204 | jsdom: '*' 1205 | peerDependenciesMeta: 1206 | '@edge-runtime/vm': 1207 | optional: true 1208 | '@vitest/browser': 1209 | optional: true 1210 | '@vitest/ui': 1211 | optional: true 1212 | happy-dom: 1213 | optional: true 1214 | jsdom: 1215 | optional: true 1216 | 1217 | which@2.0.2: 1218 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1219 | engines: {node: '>= 8'} 1220 | hasBin: true 1221 | 1222 | word-wrap@1.2.3: 1223 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1224 | engines: {node: '>=0.10.0'} 1225 | 1226 | wrappy@1.0.2: 1227 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1228 | 1229 | yallist@4.0.0: 1230 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1231 | 1232 | yocto-queue@0.1.0: 1233 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1234 | engines: {node: '>=10'} 1235 | 1236 | snapshots: 1237 | 1238 | '@esbuild/android-arm64@0.17.16': 1239 | optional: true 1240 | 1241 | '@esbuild/android-arm@0.17.16': 1242 | optional: true 1243 | 1244 | '@esbuild/android-x64@0.17.16': 1245 | optional: true 1246 | 1247 | '@esbuild/darwin-arm64@0.17.16': 1248 | optional: true 1249 | 1250 | '@esbuild/darwin-x64@0.17.16': 1251 | optional: true 1252 | 1253 | '@esbuild/freebsd-arm64@0.17.16': 1254 | optional: true 1255 | 1256 | '@esbuild/freebsd-x64@0.17.16': 1257 | optional: true 1258 | 1259 | '@esbuild/linux-arm64@0.17.16': 1260 | optional: true 1261 | 1262 | '@esbuild/linux-arm@0.17.16': 1263 | optional: true 1264 | 1265 | '@esbuild/linux-ia32@0.17.16': 1266 | optional: true 1267 | 1268 | '@esbuild/linux-loong64@0.17.16': 1269 | optional: true 1270 | 1271 | '@esbuild/linux-mips64el@0.17.16': 1272 | optional: true 1273 | 1274 | '@esbuild/linux-ppc64@0.17.16': 1275 | optional: true 1276 | 1277 | '@esbuild/linux-riscv64@0.17.16': 1278 | optional: true 1279 | 1280 | '@esbuild/linux-s390x@0.17.16': 1281 | optional: true 1282 | 1283 | '@esbuild/linux-x64@0.17.16': 1284 | optional: true 1285 | 1286 | '@esbuild/netbsd-x64@0.17.16': 1287 | optional: true 1288 | 1289 | '@esbuild/openbsd-x64@0.17.16': 1290 | optional: true 1291 | 1292 | '@esbuild/sunos-x64@0.17.16': 1293 | optional: true 1294 | 1295 | '@esbuild/win32-arm64@0.17.16': 1296 | optional: true 1297 | 1298 | '@esbuild/win32-ia32@0.17.16': 1299 | optional: true 1300 | 1301 | '@esbuild/win32-x64@0.17.16': 1302 | optional: true 1303 | 1304 | '@eslint-community/eslint-utils@4.4.0(eslint@8.38.0)': 1305 | dependencies: 1306 | eslint: 8.38.0 1307 | eslint-visitor-keys: 3.4.0 1308 | 1309 | '@eslint-community/regexpp@4.5.0': {} 1310 | 1311 | '@eslint/eslintrc@2.0.2': 1312 | dependencies: 1313 | ajv: 6.12.6 1314 | debug: 4.3.4 1315 | espree: 9.5.1 1316 | globals: 13.20.0 1317 | ignore: 5.2.4 1318 | import-fresh: 3.3.0 1319 | js-yaml: 4.1.0 1320 | minimatch: 3.1.2 1321 | strip-json-comments: 3.1.1 1322 | transitivePeerDependencies: 1323 | - supports-color 1324 | 1325 | '@eslint/js@8.38.0': {} 1326 | 1327 | '@humanwhocodes/config-array@0.11.8': 1328 | dependencies: 1329 | '@humanwhocodes/object-schema': 1.2.1 1330 | debug: 4.3.4 1331 | minimatch: 3.1.2 1332 | transitivePeerDependencies: 1333 | - supports-color 1334 | 1335 | '@humanwhocodes/module-importer@1.0.1': {} 1336 | 1337 | '@humanwhocodes/object-schema@1.2.1': {} 1338 | 1339 | '@jridgewell/resolve-uri@3.1.0': {} 1340 | 1341 | '@jridgewell/sourcemap-codec@1.4.14': {} 1342 | 1343 | '@jridgewell/sourcemap-codec@1.4.15': {} 1344 | 1345 | '@jridgewell/trace-mapping@0.3.18': 1346 | dependencies: 1347 | '@jridgewell/resolve-uri': 3.1.0 1348 | '@jridgewell/sourcemap-codec': 1.4.14 1349 | 1350 | '@nodelib/fs.scandir@2.1.5': 1351 | dependencies: 1352 | '@nodelib/fs.stat': 2.0.5 1353 | run-parallel: 1.2.0 1354 | 1355 | '@nodelib/fs.stat@2.0.5': {} 1356 | 1357 | '@nodelib/fs.walk@1.2.8': 1358 | dependencies: 1359 | '@nodelib/fs.scandir': 2.1.5 1360 | fastq: 1.15.0 1361 | 1362 | '@playwright/test@1.32.3': 1363 | dependencies: 1364 | '@types/node': 18.15.11 1365 | playwright-core: 1.32.3 1366 | optionalDependencies: 1367 | fsevents: 2.3.2 1368 | 1369 | '@polka/url@1.0.0-next.21': {} 1370 | 1371 | '@sveltejs/adapter-auto@2.0.0(@sveltejs/kit@1.15.5)': 1372 | dependencies: 1373 | '@sveltejs/kit': 1.15.5(svelte@3.58.0)(vite@4.2.1) 1374 | import-meta-resolve: 2.2.2 1375 | 1376 | '@sveltejs/kit@1.15.5(svelte@3.58.0)(vite@4.2.1)': 1377 | dependencies: 1378 | '@sveltejs/vite-plugin-svelte': 2.0.4(svelte@3.58.0)(vite@4.2.1) 1379 | '@types/cookie': 0.5.1 1380 | cookie: 0.5.0 1381 | devalue: 4.3.0 1382 | esm-env: 1.0.0 1383 | kleur: 4.1.5 1384 | magic-string: 0.30.0 1385 | mime: 3.0.0 1386 | sade: 1.8.1 1387 | set-cookie-parser: 2.6.0 1388 | sirv: 2.0.2 1389 | svelte: 3.58.0 1390 | tiny-glob: 0.2.9 1391 | undici: 5.20.0 1392 | vite: 4.2.1(@types/node@18.15.11) 1393 | transitivePeerDependencies: 1394 | - supports-color 1395 | 1396 | '@sveltejs/package@2.0.2(svelte@3.58.0)(typescript@5.0.4)': 1397 | dependencies: 1398 | chokidar: 3.5.3 1399 | kleur: 4.1.5 1400 | sade: 1.8.1 1401 | svelte: 3.58.0 1402 | svelte2tsx: 0.6.11(svelte@3.58.0)(typescript@5.0.4) 1403 | transitivePeerDependencies: 1404 | - typescript 1405 | 1406 | '@sveltejs/vite-plugin-svelte@2.0.4(svelte@3.58.0)(vite@4.2.1)': 1407 | dependencies: 1408 | debug: 4.3.4 1409 | deepmerge: 4.3.1 1410 | kleur: 4.1.5 1411 | magic-string: 0.30.0 1412 | svelte: 3.58.0 1413 | svelte-hmr: 0.15.1(svelte@3.58.0) 1414 | vite: 4.2.1(@types/node@18.15.11) 1415 | vitefu: 0.2.4(vite@4.2.1) 1416 | transitivePeerDependencies: 1417 | - supports-color 1418 | 1419 | '@types/chai-subset@1.3.3': 1420 | dependencies: 1421 | '@types/chai': 4.3.4 1422 | 1423 | '@types/chai@4.3.4': {} 1424 | 1425 | '@types/cookie@0.5.1': {} 1426 | 1427 | '@types/json-schema@7.0.11': {} 1428 | 1429 | '@types/node@18.15.11': {} 1430 | 1431 | '@types/pug@2.0.6': {} 1432 | 1433 | '@types/semver@7.3.13': {} 1434 | 1435 | '@types/ua-parser-js@0.7.36': {} 1436 | 1437 | '@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@5.0.4)': 1438 | dependencies: 1439 | '@eslint-community/regexpp': 4.5.0 1440 | '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@5.0.4) 1441 | '@typescript-eslint/scope-manager': 5.58.0 1442 | '@typescript-eslint/type-utils': 5.58.0(eslint@8.38.0)(typescript@5.0.4) 1443 | '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@5.0.4) 1444 | debug: 4.3.4 1445 | eslint: 8.38.0 1446 | grapheme-splitter: 1.0.4 1447 | ignore: 5.2.4 1448 | natural-compare-lite: 1.4.0 1449 | semver: 7.4.0 1450 | tsutils: 3.21.0(typescript@5.0.4) 1451 | typescript: 5.0.4 1452 | transitivePeerDependencies: 1453 | - supports-color 1454 | 1455 | '@typescript-eslint/parser@5.58.0(eslint@8.38.0)(typescript@5.0.4)': 1456 | dependencies: 1457 | '@typescript-eslint/scope-manager': 5.58.0 1458 | '@typescript-eslint/types': 5.58.0 1459 | '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) 1460 | debug: 4.3.4 1461 | eslint: 8.38.0 1462 | typescript: 5.0.4 1463 | transitivePeerDependencies: 1464 | - supports-color 1465 | 1466 | '@typescript-eslint/scope-manager@5.58.0': 1467 | dependencies: 1468 | '@typescript-eslint/types': 5.58.0 1469 | '@typescript-eslint/visitor-keys': 5.58.0 1470 | 1471 | '@typescript-eslint/type-utils@5.58.0(eslint@8.38.0)(typescript@5.0.4)': 1472 | dependencies: 1473 | '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) 1474 | '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@5.0.4) 1475 | debug: 4.3.4 1476 | eslint: 8.38.0 1477 | tsutils: 3.21.0(typescript@5.0.4) 1478 | typescript: 5.0.4 1479 | transitivePeerDependencies: 1480 | - supports-color 1481 | 1482 | '@typescript-eslint/types@5.58.0': {} 1483 | 1484 | '@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.4)': 1485 | dependencies: 1486 | '@typescript-eslint/types': 5.58.0 1487 | '@typescript-eslint/visitor-keys': 5.58.0 1488 | debug: 4.3.4 1489 | globby: 11.1.0 1490 | is-glob: 4.0.3 1491 | semver: 7.4.0 1492 | tsutils: 3.21.0(typescript@5.0.4) 1493 | typescript: 5.0.4 1494 | transitivePeerDependencies: 1495 | - supports-color 1496 | 1497 | '@typescript-eslint/utils@5.58.0(eslint@8.38.0)(typescript@5.0.4)': 1498 | dependencies: 1499 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) 1500 | '@types/json-schema': 7.0.11 1501 | '@types/semver': 7.3.13 1502 | '@typescript-eslint/scope-manager': 5.58.0 1503 | '@typescript-eslint/types': 5.58.0 1504 | '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) 1505 | eslint: 8.38.0 1506 | eslint-scope: 5.1.1 1507 | semver: 7.4.0 1508 | transitivePeerDependencies: 1509 | - supports-color 1510 | - typescript 1511 | 1512 | '@typescript-eslint/visitor-keys@5.58.0': 1513 | dependencies: 1514 | '@typescript-eslint/types': 5.58.0 1515 | eslint-visitor-keys: 3.4.0 1516 | 1517 | acorn-jsx@5.3.2(acorn@8.8.2): 1518 | dependencies: 1519 | acorn: 8.8.2 1520 | 1521 | acorn-walk@8.2.0: {} 1522 | 1523 | acorn@8.8.2: {} 1524 | 1525 | ajv@6.12.6: 1526 | dependencies: 1527 | fast-deep-equal: 3.1.3 1528 | fast-json-stable-stringify: 2.1.0 1529 | json-schema-traverse: 0.4.1 1530 | uri-js: 4.4.1 1531 | 1532 | ansi-regex@5.0.1: {} 1533 | 1534 | ansi-styles@4.3.0: 1535 | dependencies: 1536 | color-convert: 2.0.1 1537 | 1538 | anymatch@3.1.3: 1539 | dependencies: 1540 | normalize-path: 3.0.0 1541 | picomatch: 2.3.1 1542 | 1543 | argparse@2.0.1: {} 1544 | 1545 | array-union@2.1.0: {} 1546 | 1547 | assertion-error@1.1.0: {} 1548 | 1549 | balanced-match@1.0.2: {} 1550 | 1551 | binary-extensions@2.2.0: {} 1552 | 1553 | brace-expansion@1.1.11: 1554 | dependencies: 1555 | balanced-match: 1.0.2 1556 | concat-map: 0.0.1 1557 | 1558 | brace-expansion@2.0.1: 1559 | dependencies: 1560 | balanced-match: 1.0.2 1561 | 1562 | braces@3.0.2: 1563 | dependencies: 1564 | fill-range: 7.0.1 1565 | 1566 | buffer-crc32@0.2.13: {} 1567 | 1568 | busboy@1.6.0: 1569 | dependencies: 1570 | streamsearch: 1.1.0 1571 | 1572 | callsites@3.1.0: {} 1573 | 1574 | chai@4.3.7: 1575 | dependencies: 1576 | assertion-error: 1.1.0 1577 | check-error: 1.0.2 1578 | deep-eql: 4.1.3 1579 | get-func-name: 2.0.0 1580 | loupe: 2.3.6 1581 | pathval: 1.1.1 1582 | type-detect: 4.0.8 1583 | 1584 | chalk@4.1.2: 1585 | dependencies: 1586 | ansi-styles: 4.3.0 1587 | supports-color: 7.2.0 1588 | 1589 | check-error@1.0.2: {} 1590 | 1591 | chokidar@3.5.3: 1592 | dependencies: 1593 | anymatch: 3.1.3 1594 | braces: 3.0.2 1595 | glob-parent: 5.1.2 1596 | is-binary-path: 2.1.0 1597 | is-glob: 4.0.3 1598 | normalize-path: 3.0.0 1599 | readdirp: 3.6.0 1600 | optionalDependencies: 1601 | fsevents: 2.3.2 1602 | 1603 | color-convert@2.0.1: 1604 | dependencies: 1605 | color-name: 1.1.4 1606 | 1607 | color-name@1.1.4: {} 1608 | 1609 | concat-map@0.0.1: {} 1610 | 1611 | cookie@0.5.0: {} 1612 | 1613 | cross-spawn@7.0.3: 1614 | dependencies: 1615 | path-key: 3.1.1 1616 | shebang-command: 2.0.0 1617 | which: 2.0.2 1618 | 1619 | debug@4.3.4: 1620 | dependencies: 1621 | ms: 2.1.2 1622 | 1623 | dedent-js@1.0.1: {} 1624 | 1625 | deep-eql@4.1.3: 1626 | dependencies: 1627 | type-detect: 4.0.8 1628 | 1629 | deep-is@0.1.4: {} 1630 | 1631 | deepmerge@4.3.1: {} 1632 | 1633 | detect-indent@6.1.0: {} 1634 | 1635 | devalue@4.3.0: {} 1636 | 1637 | dir-glob@3.0.1: 1638 | dependencies: 1639 | path-type: 4.0.0 1640 | 1641 | doctrine@3.0.0: 1642 | dependencies: 1643 | esutils: 2.0.3 1644 | 1645 | es6-promise@3.3.1: {} 1646 | 1647 | esbuild@0.17.16: 1648 | optionalDependencies: 1649 | '@esbuild/android-arm': 0.17.16 1650 | '@esbuild/android-arm64': 0.17.16 1651 | '@esbuild/android-x64': 0.17.16 1652 | '@esbuild/darwin-arm64': 0.17.16 1653 | '@esbuild/darwin-x64': 0.17.16 1654 | '@esbuild/freebsd-arm64': 0.17.16 1655 | '@esbuild/freebsd-x64': 0.17.16 1656 | '@esbuild/linux-arm': 0.17.16 1657 | '@esbuild/linux-arm64': 0.17.16 1658 | '@esbuild/linux-ia32': 0.17.16 1659 | '@esbuild/linux-loong64': 0.17.16 1660 | '@esbuild/linux-mips64el': 0.17.16 1661 | '@esbuild/linux-ppc64': 0.17.16 1662 | '@esbuild/linux-riscv64': 0.17.16 1663 | '@esbuild/linux-s390x': 0.17.16 1664 | '@esbuild/linux-x64': 0.17.16 1665 | '@esbuild/netbsd-x64': 0.17.16 1666 | '@esbuild/openbsd-x64': 0.17.16 1667 | '@esbuild/sunos-x64': 0.17.16 1668 | '@esbuild/win32-arm64': 0.17.16 1669 | '@esbuild/win32-ia32': 0.17.16 1670 | '@esbuild/win32-x64': 0.17.16 1671 | 1672 | escape-string-regexp@4.0.0: {} 1673 | 1674 | eslint-config-prettier@8.8.0(eslint@8.38.0): 1675 | dependencies: 1676 | eslint: 8.38.0 1677 | 1678 | eslint-plugin-svelte3@4.0.0(eslint@8.38.0)(svelte@3.58.0): 1679 | dependencies: 1680 | eslint: 8.38.0 1681 | svelte: 3.58.0 1682 | 1683 | eslint-scope@5.1.1: 1684 | dependencies: 1685 | esrecurse: 4.3.0 1686 | estraverse: 4.3.0 1687 | 1688 | eslint-scope@7.2.0: 1689 | dependencies: 1690 | esrecurse: 4.3.0 1691 | estraverse: 5.3.0 1692 | 1693 | eslint-visitor-keys@3.4.0: {} 1694 | 1695 | eslint@8.38.0: 1696 | dependencies: 1697 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) 1698 | '@eslint-community/regexpp': 4.5.0 1699 | '@eslint/eslintrc': 2.0.2 1700 | '@eslint/js': 8.38.0 1701 | '@humanwhocodes/config-array': 0.11.8 1702 | '@humanwhocodes/module-importer': 1.0.1 1703 | '@nodelib/fs.walk': 1.2.8 1704 | ajv: 6.12.6 1705 | chalk: 4.1.2 1706 | cross-spawn: 7.0.3 1707 | debug: 4.3.4 1708 | doctrine: 3.0.0 1709 | escape-string-regexp: 4.0.0 1710 | eslint-scope: 7.2.0 1711 | eslint-visitor-keys: 3.4.0 1712 | espree: 9.5.1 1713 | esquery: 1.5.0 1714 | esutils: 2.0.3 1715 | fast-deep-equal: 3.1.3 1716 | file-entry-cache: 6.0.1 1717 | find-up: 5.0.0 1718 | glob-parent: 6.0.2 1719 | globals: 13.20.0 1720 | grapheme-splitter: 1.0.4 1721 | ignore: 5.2.4 1722 | import-fresh: 3.3.0 1723 | imurmurhash: 0.1.4 1724 | is-glob: 4.0.3 1725 | is-path-inside: 3.0.3 1726 | js-sdsl: 4.4.0 1727 | js-yaml: 4.1.0 1728 | json-stable-stringify-without-jsonify: 1.0.1 1729 | levn: 0.4.1 1730 | lodash.merge: 4.6.2 1731 | minimatch: 3.1.2 1732 | natural-compare: 1.4.0 1733 | optionator: 0.9.1 1734 | strip-ansi: 6.0.1 1735 | strip-json-comments: 3.1.1 1736 | text-table: 0.2.0 1737 | transitivePeerDependencies: 1738 | - supports-color 1739 | 1740 | esm-env@1.0.0: {} 1741 | 1742 | espree@9.5.1: 1743 | dependencies: 1744 | acorn: 8.8.2 1745 | acorn-jsx: 5.3.2(acorn@8.8.2) 1746 | eslint-visitor-keys: 3.4.0 1747 | 1748 | esquery@1.5.0: 1749 | dependencies: 1750 | estraverse: 5.3.0 1751 | 1752 | esrecurse@4.3.0: 1753 | dependencies: 1754 | estraverse: 5.3.0 1755 | 1756 | estraverse@4.3.0: {} 1757 | 1758 | estraverse@5.3.0: {} 1759 | 1760 | esutils@2.0.3: {} 1761 | 1762 | fast-deep-equal@3.1.3: {} 1763 | 1764 | fast-glob@3.2.12: 1765 | dependencies: 1766 | '@nodelib/fs.stat': 2.0.5 1767 | '@nodelib/fs.walk': 1.2.8 1768 | glob-parent: 5.1.2 1769 | merge2: 1.4.1 1770 | micromatch: 4.0.5 1771 | 1772 | fast-json-stable-stringify@2.1.0: {} 1773 | 1774 | fast-levenshtein@2.0.6: {} 1775 | 1776 | fastq@1.15.0: 1777 | dependencies: 1778 | reusify: 1.0.4 1779 | 1780 | file-entry-cache@6.0.1: 1781 | dependencies: 1782 | flat-cache: 3.0.4 1783 | 1784 | fill-range@7.0.1: 1785 | dependencies: 1786 | to-regex-range: 5.0.1 1787 | 1788 | find-up@5.0.0: 1789 | dependencies: 1790 | locate-path: 6.0.0 1791 | path-exists: 4.0.0 1792 | 1793 | flat-cache@3.0.4: 1794 | dependencies: 1795 | flatted: 3.2.7 1796 | rimraf: 3.0.2 1797 | 1798 | flatted@3.2.7: {} 1799 | 1800 | fs.realpath@1.0.0: {} 1801 | 1802 | fsevents@2.3.2: 1803 | optional: true 1804 | 1805 | function-bind@1.1.1: {} 1806 | 1807 | get-func-name@2.0.0: {} 1808 | 1809 | glob-parent@5.1.2: 1810 | dependencies: 1811 | is-glob: 4.0.3 1812 | 1813 | glob-parent@6.0.2: 1814 | dependencies: 1815 | is-glob: 4.0.3 1816 | 1817 | glob@7.2.3: 1818 | dependencies: 1819 | fs.realpath: 1.0.0 1820 | inflight: 1.0.6 1821 | inherits: 2.0.4 1822 | minimatch: 3.1.2 1823 | once: 1.4.0 1824 | path-is-absolute: 1.0.1 1825 | 1826 | glob@8.1.0: 1827 | dependencies: 1828 | fs.realpath: 1.0.0 1829 | inflight: 1.0.6 1830 | inherits: 2.0.4 1831 | minimatch: 5.1.6 1832 | once: 1.4.0 1833 | 1834 | globals@13.20.0: 1835 | dependencies: 1836 | type-fest: 0.20.2 1837 | 1838 | globalyzer@0.1.0: {} 1839 | 1840 | globby@11.1.0: 1841 | dependencies: 1842 | array-union: 2.1.0 1843 | dir-glob: 3.0.1 1844 | fast-glob: 3.2.12 1845 | ignore: 5.2.4 1846 | merge2: 1.4.1 1847 | slash: 3.0.0 1848 | 1849 | globrex@0.1.2: {} 1850 | 1851 | graceful-fs@4.2.11: {} 1852 | 1853 | grapheme-splitter@1.0.4: {} 1854 | 1855 | has-flag@4.0.0: {} 1856 | 1857 | has@1.0.3: 1858 | dependencies: 1859 | function-bind: 1.1.1 1860 | 1861 | ignore-walk@5.0.1: 1862 | dependencies: 1863 | minimatch: 5.1.6 1864 | 1865 | ignore@5.2.4: {} 1866 | 1867 | import-fresh@3.3.0: 1868 | dependencies: 1869 | parent-module: 1.0.1 1870 | resolve-from: 4.0.0 1871 | 1872 | import-meta-resolve@2.2.2: {} 1873 | 1874 | imurmurhash@0.1.4: {} 1875 | 1876 | inflight@1.0.6: 1877 | dependencies: 1878 | once: 1.4.0 1879 | wrappy: 1.0.2 1880 | 1881 | inherits@2.0.4: {} 1882 | 1883 | is-binary-path@2.1.0: 1884 | dependencies: 1885 | binary-extensions: 2.2.0 1886 | 1887 | is-core-module@2.12.0: 1888 | dependencies: 1889 | has: 1.0.3 1890 | 1891 | is-extglob@2.1.1: {} 1892 | 1893 | is-glob@4.0.3: 1894 | dependencies: 1895 | is-extglob: 2.1.1 1896 | 1897 | is-number@7.0.0: {} 1898 | 1899 | is-path-inside@3.0.3: {} 1900 | 1901 | isexe@2.0.0: {} 1902 | 1903 | js-sdsl@4.4.0: {} 1904 | 1905 | js-yaml@4.1.0: 1906 | dependencies: 1907 | argparse: 2.0.1 1908 | 1909 | json-schema-traverse@0.4.1: {} 1910 | 1911 | json-stable-stringify-without-jsonify@1.0.1: {} 1912 | 1913 | kleur@4.1.5: {} 1914 | 1915 | levn@0.4.1: 1916 | dependencies: 1917 | prelude-ls: 1.2.1 1918 | type-check: 0.4.0 1919 | 1920 | local-pkg@0.4.3: {} 1921 | 1922 | locate-path@6.0.0: 1923 | dependencies: 1924 | p-locate: 5.0.0 1925 | 1926 | lodash.merge@4.6.2: {} 1927 | 1928 | loupe@2.3.6: 1929 | dependencies: 1930 | get-func-name: 2.0.0 1931 | 1932 | lower-case@2.0.2: 1933 | dependencies: 1934 | tslib: 2.5.0 1935 | 1936 | lru-cache@6.0.0: 1937 | dependencies: 1938 | yallist: 4.0.0 1939 | 1940 | magic-string@0.27.0: 1941 | dependencies: 1942 | '@jridgewell/sourcemap-codec': 1.4.15 1943 | 1944 | magic-string@0.30.0: 1945 | dependencies: 1946 | '@jridgewell/sourcemap-codec': 1.4.15 1947 | 1948 | merge2@1.4.1: {} 1949 | 1950 | micromatch@4.0.5: 1951 | dependencies: 1952 | braces: 3.0.2 1953 | picomatch: 2.3.1 1954 | 1955 | mime@3.0.0: {} 1956 | 1957 | min-indent@1.0.1: {} 1958 | 1959 | minimatch@3.1.2: 1960 | dependencies: 1961 | brace-expansion: 1.1.11 1962 | 1963 | minimatch@5.1.6: 1964 | dependencies: 1965 | brace-expansion: 2.0.1 1966 | 1967 | minimist@1.2.8: {} 1968 | 1969 | mkdirp@0.5.6: 1970 | dependencies: 1971 | minimist: 1.2.8 1972 | 1973 | mri@1.2.0: {} 1974 | 1975 | mrmime@1.0.1: {} 1976 | 1977 | ms@2.1.2: {} 1978 | 1979 | nanoid@3.3.6: {} 1980 | 1981 | natural-compare-lite@1.4.0: {} 1982 | 1983 | natural-compare@1.4.0: {} 1984 | 1985 | no-case@3.0.4: 1986 | dependencies: 1987 | lower-case: 2.0.2 1988 | tslib: 2.5.0 1989 | 1990 | normalize-path@3.0.0: {} 1991 | 1992 | npm-bundled@2.0.1: 1993 | dependencies: 1994 | npm-normalize-package-bin: 2.0.0 1995 | 1996 | npm-normalize-package-bin@2.0.0: {} 1997 | 1998 | npm-packlist@5.1.3: 1999 | dependencies: 2000 | glob: 8.1.0 2001 | ignore-walk: 5.0.1 2002 | npm-bundled: 2.0.1 2003 | npm-normalize-package-bin: 2.0.0 2004 | 2005 | once@1.4.0: 2006 | dependencies: 2007 | wrappy: 1.0.2 2008 | 2009 | optionator@0.9.1: 2010 | dependencies: 2011 | deep-is: 0.1.4 2012 | fast-levenshtein: 2.0.6 2013 | levn: 0.4.1 2014 | prelude-ls: 1.2.1 2015 | type-check: 0.4.0 2016 | word-wrap: 1.2.3 2017 | 2018 | p-limit@3.1.0: 2019 | dependencies: 2020 | yocto-queue: 0.1.0 2021 | 2022 | p-locate@5.0.0: 2023 | dependencies: 2024 | p-limit: 3.1.0 2025 | 2026 | parent-module@1.0.1: 2027 | dependencies: 2028 | callsites: 3.1.0 2029 | 2030 | pascal-case@3.1.2: 2031 | dependencies: 2032 | no-case: 3.0.4 2033 | tslib: 2.5.0 2034 | 2035 | path-exists@4.0.0: {} 2036 | 2037 | path-is-absolute@1.0.1: {} 2038 | 2039 | path-key@3.1.1: {} 2040 | 2041 | path-parse@1.0.7: {} 2042 | 2043 | path-type@4.0.0: {} 2044 | 2045 | pathval@1.1.1: {} 2046 | 2047 | picocolors@1.0.0: {} 2048 | 2049 | picomatch@2.3.1: {} 2050 | 2051 | playwright-core@1.32.3: {} 2052 | 2053 | postcss@8.4.21: 2054 | dependencies: 2055 | nanoid: 3.3.6 2056 | picocolors: 1.0.0 2057 | source-map-js: 1.0.2 2058 | 2059 | prelude-ls@1.2.1: {} 2060 | 2061 | prettier-plugin-svelte@2.10.0(prettier@2.8.7)(svelte@3.58.0): 2062 | dependencies: 2063 | prettier: 2.8.7 2064 | svelte: 3.58.0 2065 | 2066 | prettier@2.8.7: {} 2067 | 2068 | publint@0.1.11: 2069 | dependencies: 2070 | npm-packlist: 5.1.3 2071 | picocolors: 1.0.0 2072 | sade: 1.8.1 2073 | 2074 | punycode@2.3.0: {} 2075 | 2076 | queue-microtask@1.2.3: {} 2077 | 2078 | readdirp@3.6.0: 2079 | dependencies: 2080 | picomatch: 2.3.1 2081 | 2082 | resolve-from@4.0.0: {} 2083 | 2084 | resolve@1.22.3: 2085 | dependencies: 2086 | is-core-module: 2.12.0 2087 | path-parse: 1.0.7 2088 | supports-preserve-symlinks-flag: 1.0.0 2089 | 2090 | reusify@1.0.4: {} 2091 | 2092 | rimraf@2.7.1: 2093 | dependencies: 2094 | glob: 7.2.3 2095 | 2096 | rimraf@3.0.2: 2097 | dependencies: 2098 | glob: 7.2.3 2099 | 2100 | rollup@3.20.2: 2101 | optionalDependencies: 2102 | fsevents: 2.3.2 2103 | 2104 | run-parallel@1.2.0: 2105 | dependencies: 2106 | queue-microtask: 1.2.3 2107 | 2108 | sade@1.8.1: 2109 | dependencies: 2110 | mri: 1.2.0 2111 | 2112 | sander@0.5.1: 2113 | dependencies: 2114 | es6-promise: 3.3.1 2115 | graceful-fs: 4.2.11 2116 | mkdirp: 0.5.6 2117 | rimraf: 2.7.1 2118 | 2119 | semver@7.4.0: 2120 | dependencies: 2121 | lru-cache: 6.0.0 2122 | 2123 | set-cookie-parser@2.6.0: {} 2124 | 2125 | shebang-command@2.0.0: 2126 | dependencies: 2127 | shebang-regex: 3.0.0 2128 | 2129 | shebang-regex@3.0.0: {} 2130 | 2131 | sirv@2.0.2: 2132 | dependencies: 2133 | '@polka/url': 1.0.0-next.21 2134 | mrmime: 1.0.1 2135 | totalist: 3.0.1 2136 | 2137 | slash@3.0.0: {} 2138 | 2139 | sorcery@0.11.0: 2140 | dependencies: 2141 | '@jridgewell/sourcemap-codec': 1.4.15 2142 | buffer-crc32: 0.2.13 2143 | minimist: 1.2.8 2144 | sander: 0.5.1 2145 | 2146 | source-map-js@1.0.2: {} 2147 | 2148 | source-map@0.6.1: {} 2149 | 2150 | streamsearch@1.1.0: {} 2151 | 2152 | strip-ansi@6.0.1: 2153 | dependencies: 2154 | ansi-regex: 5.0.1 2155 | 2156 | strip-indent@3.0.0: 2157 | dependencies: 2158 | min-indent: 1.0.1 2159 | 2160 | strip-json-comments@3.1.1: {} 2161 | 2162 | strip-literal@1.0.1: 2163 | dependencies: 2164 | acorn: 8.8.2 2165 | 2166 | supports-color@7.2.0: 2167 | dependencies: 2168 | has-flag: 4.0.0 2169 | 2170 | supports-preserve-symlinks-flag@1.0.0: {} 2171 | 2172 | svelte-check@3.2.0(svelte@3.58.0): 2173 | dependencies: 2174 | '@jridgewell/trace-mapping': 0.3.18 2175 | chokidar: 3.5.3 2176 | fast-glob: 3.2.12 2177 | import-fresh: 3.3.0 2178 | picocolors: 1.0.0 2179 | sade: 1.8.1 2180 | svelte: 3.58.0 2181 | svelte-preprocess: 5.0.3(svelte@3.58.0)(typescript@5.0.4) 2182 | typescript: 5.0.4 2183 | transitivePeerDependencies: 2184 | - '@babel/core' 2185 | - coffeescript 2186 | - less 2187 | - postcss 2188 | - postcss-load-config 2189 | - pug 2190 | - sass 2191 | - stylus 2192 | - sugarss 2193 | 2194 | svelte-hmr@0.15.1(svelte@3.58.0): 2195 | dependencies: 2196 | svelte: 3.58.0 2197 | 2198 | svelte-preprocess@5.0.3(svelte@3.58.0)(typescript@5.0.4): 2199 | dependencies: 2200 | '@types/pug': 2.0.6 2201 | detect-indent: 6.1.0 2202 | magic-string: 0.27.0 2203 | sorcery: 0.11.0 2204 | strip-indent: 3.0.0 2205 | svelte: 3.58.0 2206 | typescript: 5.0.4 2207 | 2208 | svelte2tsx@0.6.11(svelte@3.58.0)(typescript@5.0.4): 2209 | dependencies: 2210 | dedent-js: 1.0.1 2211 | pascal-case: 3.1.2 2212 | svelte: 3.58.0 2213 | typescript: 5.0.4 2214 | 2215 | svelte@3.58.0: {} 2216 | 2217 | text-table@0.2.0: {} 2218 | 2219 | tiny-glob@0.2.9: 2220 | dependencies: 2221 | globalyzer: 0.1.0 2222 | globrex: 0.1.2 2223 | 2224 | tinybench@2.4.0: {} 2225 | 2226 | tinypool@0.3.1: {} 2227 | 2228 | tinyspy@1.1.1: {} 2229 | 2230 | to-regex-range@5.0.1: 2231 | dependencies: 2232 | is-number: 7.0.0 2233 | 2234 | totalist@3.0.1: {} 2235 | 2236 | tslib@1.14.1: {} 2237 | 2238 | tslib@2.5.0: {} 2239 | 2240 | tsutils@3.21.0(typescript@5.0.4): 2241 | dependencies: 2242 | tslib: 1.14.1 2243 | typescript: 5.0.4 2244 | 2245 | type-check@0.4.0: 2246 | dependencies: 2247 | prelude-ls: 1.2.1 2248 | 2249 | type-detect@4.0.8: {} 2250 | 2251 | type-fest@0.20.2: {} 2252 | 2253 | typescript@5.0.4: {} 2254 | 2255 | ua-parser-js@1.0.35: {} 2256 | 2257 | undici@5.20.0: 2258 | dependencies: 2259 | busboy: 1.6.0 2260 | 2261 | uri-js@4.4.1: 2262 | dependencies: 2263 | punycode: 2.3.0 2264 | 2265 | vite@4.2.1(@types/node@18.15.11): 2266 | dependencies: 2267 | '@types/node': 18.15.11 2268 | esbuild: 0.17.16 2269 | postcss: 8.4.21 2270 | resolve: 1.22.3 2271 | rollup: 3.20.2 2272 | optionalDependencies: 2273 | fsevents: 2.3.2 2274 | 2275 | vitefu@0.2.4(vite@4.2.1): 2276 | dependencies: 2277 | vite: 4.2.1(@types/node@18.15.11) 2278 | 2279 | vitest@0.25.8: 2280 | dependencies: 2281 | '@types/chai': 4.3.4 2282 | '@types/chai-subset': 1.3.3 2283 | '@types/node': 18.15.11 2284 | acorn: 8.8.2 2285 | acorn-walk: 8.2.0 2286 | chai: 4.3.7 2287 | debug: 4.3.4 2288 | local-pkg: 0.4.3 2289 | source-map: 0.6.1 2290 | strip-literal: 1.0.1 2291 | tinybench: 2.4.0 2292 | tinypool: 0.3.1 2293 | tinyspy: 1.1.1 2294 | vite: 4.2.1(@types/node@18.15.11) 2295 | transitivePeerDependencies: 2296 | - less 2297 | - sass 2298 | - stylus 2299 | - sugarss 2300 | - supports-color 2301 | - terser 2302 | 2303 | which@2.0.2: 2304 | dependencies: 2305 | isexe: 2.0.0 2306 | 2307 | word-wrap@1.2.3: {} 2308 | 2309 | wrappy@1.0.2: {} 2310 | 2311 | yallist@4.0.0: {} 2312 | 2313 | yocto-queue@0.1.0: {} 2314 | --------------------------------------------------------------------------------