From 8bb4e0d39e085b4938723cc4fba0b0bd3351926d Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Wed, 21 Jun 2023 23:19:28 -0400 Subject: [PATCH 1/7] Add API to enable/disable debug logging (in development) --- packages/suspense/src/cache/createCache.ts | 70 ++++++++++--------- .../createIntervalCache.ts | 57 +++++++-------- .../src/cache/createStreamingCache.ts | 52 +++++++------- packages/suspense/src/index.ts | 1 + packages/suspense/src/utils/debugging.ts | 19 +++++ 5 files changed, 109 insertions(+), 90 deletions(-) create mode 100644 packages/suspense/src/utils/debugging.ts diff --git a/packages/suspense/src/cache/createCache.ts b/packages/suspense/src/cache/createCache.ts index 73b4285..866612b 100644 --- a/packages/suspense/src/cache/createCache.ts +++ b/packages/suspense/src/cache/createCache.ts @@ -19,6 +19,7 @@ import { } from "../utils/Record"; import { assertPendingRecord } from "../utils/assertRecordStatus"; import { createDeferred } from "../utils/createDeferred"; +import { log } from "../utils/debugging"; import { defaultGetCache } from "../utils/defaultGetCache"; import { defaultGetKey } from "../utils/defaultGetKey"; import { isPromiseLike } from "../utils/isPromiseLike"; @@ -49,6 +50,7 @@ export type CreateCacheOptions, Value> = { immutable?: boolean; }; debugLabel?: string; + enableDebugLogging?: boolean; getKey?: (params: Params) => string; load: ( params: Params, @@ -56,13 +58,16 @@ export type CreateCacheOptions, Value> = { ) => PromiseLike | Value; }; -// Enable to help with debugging in dev -const DEBUG_LOG_IN_DEV = false; - export function createCache, Value>( options: CreateCacheOptions ): Cache { - let { config = {}, debugLabel, getKey = defaultGetKey, load } = options; + let { + config = {}, + debugLabel, + enableDebugLogging, + getKey = defaultGetKey, + load, + } = options; const { getCache = defaultGetCache, immutable = false } = config; if (isDevelopment) { @@ -85,22 +90,20 @@ export function createCache, Value>( }; } - const debugLogInDev = (debug: string, params?: Params, ...args: any[]) => { - if (DEBUG_LOG_IN_DEV && isDevelopment) { - const cacheKey = params ? `"${getKey(params)}"` : ""; - const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; - - console.log( - `%c${prefix}`, - "font-weight: bold; color: yellow;", - debug, - cacheKey, - ...args - ); - } + const debugLog = (message: string, params?: Params, ...args: any[]) => { + const cacheKey = params ? `"${getKey(params)}"` : ""; + const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; + + log(enableDebugLogging, [ + `%c${prefix}`, + "font-weight: bold; color: yellow;", + message, + cacheKey, + ...args, + ]); }; - debugLogInDev("Creating cache ..."); + debugLog("Creating cache ..."); // This map enables selective mutations to be scheduled with React // (one record can be invalidated without affecting others) @@ -132,7 +135,7 @@ export function createCache, Value>( // So we check the mutationAbortControllerMap to infer this. const abortController = mutationAbortControllerMap.get(cacheKey); if (abortController) { - debugLogInDev("abort()", params); + debugLog("abort()", params); abortController.abort(); @@ -143,7 +146,7 @@ export function createCache, Value>( const record = pendingMutationRecordMap.get(cacheKey) ?? recordMap.get(cacheKey); if (record && isPendingRecord(record)) { - debugLogInDev("abort()", params); + debugLog("abort()", params); pendingMutationRecordMap.delete(cacheKey); @@ -173,7 +176,7 @@ export function createCache, Value>( let record: Record | undefined = getRecord(...params); if (record != null) { if (isPendingRecord(record)) { - debugLogInDev("cache()", params, "Update pending record to:", value); + debugLog("cache()", params, "Update pending record to:", value); const { abortController, deferred } = record.data; @@ -188,7 +191,7 @@ export function createCache, Value>( } } - debugLogInDev("cache()", params, "Create new resolved record with:", value); + debugLog("cache()", params, "Create new resolved record with:", value); record = createResolvedRecord(value); @@ -198,10 +201,11 @@ export function createCache, Value>( function createPendingMutationRecordMap(): CacheMap> { return getCache((key) => { - // we don't really need to do anything here, this map will almost always be a subset of the recordMap + // We don't really need to do anything here + // This map will almost always be a subset of the recordMap // but we also don't want it to bypass the getCache() eviction logic (if any) - // leave a debug log here in case we need to revisit this - debugLogInDev(`createRecordMap() -> eviction: ${key}`); + // Leave a debug log here in case we need to revisit this + debugLog(`getCache() ${key}`); }); } @@ -211,7 +215,7 @@ export function createCache, Value>( createPendingMutationRecordMap ); - debugLogInDev(`evict()`, params); + debugLog(`evict()`, params); const didDelete = recordMap.delete(cacheKey); pendingMutationRecordMap.delete(cacheKey); @@ -226,7 +230,7 @@ export function createCache, Value>( createPendingMutationRecordMap ); - debugLogInDev(`evictAll()`, undefined); + debugLog(`evictAll()`, undefined); recordMap.clear(); pendingMutationRecordMap.clear(); @@ -256,7 +260,7 @@ export function createCache, Value>( let record = getRecord(...params); if (record == null) { - debugLogInDev( + debugLog( "getOrCreateRecord(): record not found. creating record...", params ); @@ -273,7 +277,7 @@ export function createCache, Value>( processPendingRecord(abortController.signal, record, ...params); } - debugLogInDev( + debugLog( "getOrCreateRecord(): record found. returning record", params, record @@ -326,7 +330,7 @@ export function createCache, Value>( } function onExternalCacheEviction(key: string): void { - debugLogInDev(`onExternalCacheEviction(${key})`); + debugLog(`onExternalCacheEviction(${key})`); const set = subscriberMap.get(key); if (set) { @@ -337,7 +341,7 @@ export function createCache, Value>( } function prefetch(...params: Params): void { - debugLogInDev(`prefetch()`, params); + debugLog(`prefetch()`, params); const promiseOrValue = readAsync(...params); if (isPromiseLike(promiseOrValue)) { @@ -399,7 +403,7 @@ export function createCache, Value>( : valueOrPromiseLike; if (!abortSignal.aborted) { - debugLogInDev( + debugLog( "processPendingRecord(): resolved", params, "resolved value: ", @@ -411,7 +415,7 @@ export function createCache, Value>( } } catch (error) { if (!abortSignal.aborted) { - debugLogInDev("processPendingRecord(): rejected", params, error); + debugLog("processPendingRecord(): rejected", params, error); updateRecordToRejected(record, error); deferred.reject(error); diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts index 87f8c39..7b0cce8 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts @@ -1,4 +1,3 @@ -import { isDevelopment } from "#is-development"; import { configure as configureArraySortingUtilities } from "array-sorting-utilities"; import { configure as configureIntervalUtilities, @@ -22,6 +21,7 @@ import { } from "../../types"; import { assertPendingRecord } from "../../utils/assertRecordStatus"; import { createDeferred } from "../../utils/createDeferred"; +import { log } from "../../utils/debugging"; import { defaultGetKey } from "../../utils/defaultGetKey"; import { isPromiseLike } from "../../utils/isPromiseLike"; import { @@ -32,9 +32,6 @@ import { import { findIntervals } from "./findIntervals"; import { sliceValues } from "./sliceValues"; -// Enable to help with debugging in dev -const DEBUG_LOG_IN_DEV = false; - type PendingMetadata = { containsPartialResults: () => void; interval: Interval; @@ -72,6 +69,7 @@ export function createIntervalCache< Value >(options: { debugLabel?: string; + enableDebugLogging?: boolean; getKey?: (...params: Params) => string; getPointForValue: GetPointForValue; load: ( @@ -82,6 +80,7 @@ export function createIntervalCache< }): IntervalCache { const { debugLabel, + enableDebugLogging, getKey = defaultGetKey, getPointForValue, load, @@ -104,24 +103,22 @@ export function createIntervalCache< DataIntervalTree, Point> > = new Map(); - const debugLogInDev = (debug: string, params?: Params, ...args: any[]) => { - if (DEBUG_LOG_IN_DEV && isDevelopment) { - const cacheKey = params ? `"${getKey(...params)}"` : ""; - const prefix = debugLabel - ? `createIntervalCache[${debugLabel}]` - : "createIntervalCache"; - - console.log( - `%c${prefix}`, - "font-weight: bold; color: yellow;", - debug, - cacheKey, - ...args - ); - } + const debugLog = (message: string, params?: Params, ...args: any[]) => { + const cacheKey = params ? `"${getKey(...params)}"` : ""; + const prefix = debugLabel + ? `createIntervalCache[${debugLabel}]` + : "createIntervalCache"; + + log(enableDebugLogging, [ + `%c${prefix}`, + "font-weight: bold; color: yellow;", + message, + cacheKey, + ...args, + ]); }; - debugLogInDev("Creating cache ..."); + debugLog("Creating cache ..."); function abort(...params: Params): boolean { const metadataMapKey = getKey(...params); @@ -132,7 +129,7 @@ export function createIntervalCache< if (metadata) { const { pendingMetadata } = metadata; if (pendingMetadata.length > 0) { - debugLogInDev("abort()", params); + debugLog("abort()", params); const cloned = [...pendingMetadata]; @@ -189,7 +186,7 @@ export function createIntervalCache< } function evict(...params: Params): boolean { - debugLogInDev("evict()", params); + debugLog("evict()", params); const cacheKey = getKey(...params); const result = metadataMap.delete(cacheKey); @@ -205,7 +202,7 @@ export function createIntervalCache< } function evictAll(): boolean { - debugLogInDev(`evictAll()`, undefined, `${metadataMap.size} records`); + debugLog(`evictAll()`, undefined, `${metadataMap.size} records`); const hadValues = metadataMap.size > 0; @@ -349,7 +346,7 @@ export function createIntervalCache< } function getValue(start: Point, end: Point, ...params: Params): Value[] { - debugLogInDev(`getValue(${start}, ${end})`, params); + debugLog(`getValue(${start}, ${end})`, params); const metadata = getOrCreateIntervalMetadata(...params); const cacheKey = createCacheKey(start, end); @@ -376,7 +373,7 @@ export function createIntervalCache< end: Point, ...params: Params ): Value[] | undefined { - debugLogInDev(`getValueIfCached(${start}, ${end})`, params); + debugLog(`getValueIfCached(${start}, ${end})`, params); const metadata = getOrCreateIntervalMetadata(...params); const cacheKey = createCacheKey(start, end); @@ -527,7 +524,7 @@ export function createIntervalCache< intervalUtils ); - debugLogInDev( + debugLog( `processPendingRecord(${start}, ${end})`, params, "\n-> metadata:", @@ -607,7 +604,7 @@ export function createIntervalCache< ...pendingPromiseLikes, ]); - debugLogInDev( + debugLog( `processPendingRecord(${start}, ${end}): resolved`, params, values @@ -646,7 +643,7 @@ export function createIntervalCache< errorMessage = error.message; } - debugLogInDev( + debugLog( `processPendingRecord(${start}, ${end}): failed`, params, errorMessage @@ -666,7 +663,7 @@ export function createIntervalCache< } function read(start: Point, end: Point, ...params: Params): Value[] { - debugLogInDev(`read(${start}, ${end})`, params); + debugLog(`read(${start}, ${end})`, params); const record = getOrCreateRecord(start, end, ...params); if (record.data.status === STATUS_RESOLVED) { @@ -683,7 +680,7 @@ export function createIntervalCache< end: Point, ...params: Params ): PromiseLike | Value[] { - debugLogInDev(`readAsync(${start}, ${end})`, params); + debugLog(`readAsync(${start}, ${end})`, params); const record = getOrCreateRecord(start, end, ...params); switch (record.data.status) { diff --git a/packages/suspense/src/cache/createStreamingCache.ts b/packages/suspense/src/cache/createStreamingCache.ts index ebc0f2c..835da04 100644 --- a/packages/suspense/src/cache/createStreamingCache.ts +++ b/packages/suspense/src/cache/createStreamingCache.ts @@ -12,41 +12,43 @@ import { StreamingValue, } from "../types"; import { createDeferred } from "../utils/createDeferred"; +import { log } from "../utils/debugging"; import { defaultGetKey } from "../utils/defaultGetKey"; -// Enable to help with debugging in dev -const DEBUG_LOG_IN_DEV = false; - export function createStreamingCache< Params extends Array, Value, AdditionalData = undefined >(options: { debugLabel?: string; + enableDebugLogging?: boolean; getKey?: (...params: Params) => string; load: ( options: StreamingCacheLoadOptions, ...params: Params ) => void; }): StreamingCache { - const { debugLabel, getKey = defaultGetKey, load } = options; - - const debugLogInDev = (debug: string, params?: Params, ...args: any[]) => { - if (DEBUG_LOG_IN_DEV && isDevelopment) { - const cacheKey = params ? `"${getKey(...params)}"` : ""; - const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; - - console.log( - `%c${prefix}`, - "font-weight: bold; color: yellow;", - debug, - cacheKey, - ...args - ); - } + const { + debugLabel, + enableDebugLogging, + getKey = defaultGetKey, + load, + } = options; + + const debugLog = (message: string, params?: Params, ...args: any[]) => { + const cacheKey = params ? `"${getKey(...params)}"` : ""; + const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; + + log(enableDebugLogging, [ + `%c${prefix}`, + "font-weight: bold; color: yellow;", + message, + cacheKey, + ...args, + ]); }; - debugLogInDev("Creating cache ..."); + debugLog("Creating cache ..."); const abortControllerMap = new Map(); const streamingValuesMap = new Map< @@ -55,7 +57,7 @@ export function createStreamingCache< >(); function abort(...params: Params): boolean { - debugLogInDev("abort()", params); + debugLog("abort()", params); const cacheKey = getKey(...params); let abortController = abortControllerMap.get(cacheKey); @@ -68,7 +70,7 @@ export function createStreamingCache< } function evict(...params: Params) { - debugLogInDev("evict()", params); + debugLog("evict()", params); const cacheKey = getKey(...params); @@ -76,11 +78,7 @@ export function createStreamingCache< } function evictAll(): boolean { - debugLogInDev( - `evictAll()`, - undefined, - `${streamingValuesMap.size} records` - ); + debugLog(`evictAll()`, undefined, `${streamingValuesMap.size} records`); const hadValues = streamingValuesMap.size > 0; @@ -207,7 +205,7 @@ export function createStreamingCache< } function prefetch(...params: Params): void { - debugLogInDev(`prefetch()`, params); + debugLog(`prefetch()`, params); getOrCreateStreamingValue(...params); } diff --git a/packages/suspense/src/index.ts b/packages/suspense/src/index.ts index 0c01463..e8c6c0b 100644 --- a/packages/suspense/src/index.ts +++ b/packages/suspense/src/index.ts @@ -13,6 +13,7 @@ export * from "./hooks/useStreamingValue"; export * from "./utils/assertRecordStatus"; export * from "./utils/createDeferred"; export * from "./utils/createInfallibleCache"; +export * from "./utils/debugging"; export * from "./utils/isPromiseLike"; export * from "./utils/isRecordStatus"; export * from "./utils/parallelize"; diff --git a/packages/suspense/src/utils/debugging.ts b/packages/suspense/src/utils/debugging.ts new file mode 100644 index 0000000..850b06c --- /dev/null +++ b/packages/suspense/src/utils/debugging.ts @@ -0,0 +1,19 @@ +import { isDevelopment } from "#is-development"; + +let enabled = false; + +export function disableDebugLogging(): void { + enabled = false; +} + +export function enableDebugLogging(): void { + enabled = true; +} + +export function log(enableDebugLogging = enabled, args: string[]) { + if (isDevelopment) { + if (enableDebugLogging) { + console.log(...args); + } + } +} From a70849968ccf8cb5185e11576a0fa898ba7b9d3b Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 13:48:20 -0400 Subject: [PATCH 2/7] Upgrade Parcel deps --- package.json | 12 +- pnpm-lock.yaml | 1273 +++++++++++++++++++++++++++--------------------- 2 files changed, 722 insertions(+), 563 deletions(-) diff --git a/package.json b/package.json index 9528493..bf19a39 100644 --- a/package.json +++ b/package.json @@ -15,17 +15,19 @@ }, "devDependencies": { "@babel/preset-typescript": "^7.21.5", - "@parcel/config-default": "^2.9.1", - "@parcel/core": "^2.9.1", - "@parcel/transformer-js": "^2.9.1", - "@parcel/transformer-react-refresh-wrap": "^2.9.1", + "@parcel/config-default": "^2.9.2", + "@parcel/core": "^2.9.2", + "@parcel/packager-ts": "2.9.2", + "@parcel/transformer-js": "^2.9.2", + "@parcel/transformer-react-refresh-wrap": "^2.9.2", + "@parcel/transformer-typescript-types": "2.9.2", "@preconstruct/cli": "^2.7.0", "@types/jest": "^29.4.0", "@types/node": "^18.14.6", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", "@types/react-virtualized-auto-sizer": "^1.0.1", - "parcel": "^2.9.1", + "parcel": "^2.9.2", "path-browserify": "^1.0.0", "prettier": "latest", "process": "^0.11.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1429457..3f7fc07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,19 +6,25 @@ importers: devDependencies: '@babel/preset-typescript': specifier: ^7.21.5 - version: 7.21.5(@babel/core@7.22.1) + version: 7.21.5(@babel/core@7.22.5) '@parcel/config-default': - specifier: ^2.9.1 - version: 2.9.1(@parcel/core@2.9.1) + specifier: ^2.9.2 + version: 2.9.2(@parcel/core@2.9.2) '@parcel/core': - specifier: ^2.9.1 - version: 2.9.1 + specifier: ^2.9.2 + version: 2.9.2 + '@parcel/packager-ts': + specifier: 2.9.2 + version: 2.9.2(@parcel/core@2.9.2) '@parcel/transformer-js': - specifier: ^2.9.1 - version: 2.9.1(@parcel/core@2.9.1) + specifier: ^2.9.2 + version: 2.9.2(@parcel/core@2.9.2) '@parcel/transformer-react-refresh-wrap': - specifier: ^2.9.1 - version: 2.9.1(@parcel/core@2.9.1) + specifier: ^2.9.2 + version: 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-typescript-types': + specifier: 2.9.2 + version: 2.9.2(@parcel/core@2.9.2)(typescript@5.0.4) '@preconstruct/cli': specifier: ^2.7.0 version: 2.7.0 @@ -38,8 +44,8 @@ importers: specifier: ^1.0.1 version: 1.0.1 parcel: - specifier: ^2.9.1 - version: 2.9.1 + specifier: ^2.9.2 + version: 2.9.2 path-browserify: specifier: ^1.0.0 version: 1.0.1 @@ -63,7 +69,7 @@ importers: version: 29.4.3(@types/node@18.14.6) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.1)(jest@29.4.3)(typescript@5.0.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.4.3)(typescript@5.0.4) typescript: specifier: ^5.0.4 version: 5.0.4 @@ -82,7 +88,7 @@ importers: version: 29.4.3(@types/node@18.14.6) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.1)(jest@29.4.3)(typescript@5.0.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.4.3)(typescript@5.0.4) typescript: specifier: ^5.0.4 version: 5.0.4 @@ -97,7 +103,7 @@ importers: version: 29.4.3(@types/node@18.14.6) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.1)(jest@29.4.3)(typescript@5.0.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.4.3)(typescript@5.0.4) typescript: specifier: ^5.0.4 version: 5.0.4 @@ -146,7 +152,7 @@ importers: version: 0.0.0-experimental-49f741046-20230305(react@0.0.0-experimental-49f741046-20230305) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.1)(jest@29.4.3)(typescript@5.0.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.4.3)(typescript@5.0.4) typescript: specifier: ^5.0.4 version: 5.0.4 @@ -155,10 +161,10 @@ importers: dependencies: '@codemirror/lang-css': specifier: latest - version: 6.2.0(@codemirror/view@6.13.0) + version: 6.2.0(@codemirror/view@6.14.0) '@codemirror/lang-html': specifier: latest - version: 6.4.4 + version: 6.4.5 '@codemirror/lang-javascript': specifier: latest version: 6.1.9 @@ -167,7 +173,7 @@ importers: version: 6.1.1 '@codemirror/language': specifier: latest - version: 6.7.0 + version: 6.8.0 '@codemirror/state': specifier: latest version: 6.2.1 @@ -206,7 +212,7 @@ importers: version: 0.0.0-experimental-49f741046-20230305(react@0.0.0-experimental-49f741046-20230305) react-router-dom: specifier: latest - version: 6.11.2(react-dom@0.0.0-experimental-49f741046-20230305)(react@0.0.0-experimental-49f741046-20230305) + version: 6.12.1(react-dom@0.0.0-experimental-49f741046-20230305)(react@0.0.0-experimental-49f741046-20230305) react-virtualized-auto-sizer: specifier: latest version: 1.0.19(react-dom@0.0.0-experimental-49f741046-20230305)(react@0.0.0-experimental-49f741046-20230305) @@ -256,13 +262,20 @@ packages: '@babel/highlight': 7.18.6 dev: true + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.5 + dev: true + /@babel/compat-data@7.21.0: resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} dev: true - /@babel/compat-data@7.22.3: - resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==} + /@babel/compat-data@7.22.5: + resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} dev: true @@ -289,20 +302,20 @@ packages: - supports-color dev: true - /@babel/core@7.22.1: - resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==} + /@babel/core@7.22.5: + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.22.3 - '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) - '@babel/helper-module-transforms': 7.22.1 - '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.4 - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.5 + '@babel/helpers': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -332,6 +345,16 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.22.5: + resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} @@ -353,27 +376,27 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1): - resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.3 - '@babel/core': 7.22.1 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.7 + '@babel/compat-data': 7.22.5 + '@babel/core': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1): + /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.5): resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-function-name': 7.21.0 @@ -392,6 +415,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} @@ -400,6 +428,14 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} @@ -407,6 +443,13 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-member-expression-to-functions@7.22.3: resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==} engines: {node: '>=6.9.0'} @@ -428,6 +471,13 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} @@ -460,6 +510,22 @@ packages: - supports-color dev: true + /@babel/helper-module-transforms@7.22.5: + resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} @@ -493,6 +559,13 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} @@ -507,21 +580,43 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/helper-split-export-declaration@7.22.5: + resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-string-parser@7.21.5: resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} @@ -533,13 +628,13 @@ packages: - supports-color dev: true - /@babel/helpers@7.22.3: - resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==} + /@babel/helpers@7.22.5: + resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: true @@ -553,6 +648,15 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.21.2: resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} engines: {node: '>=6.0.0'} @@ -569,12 +673,12 @@ packages: '@babel/types': 7.22.3 dev: true - /@babel/parser@7.22.4: - resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} + /@babel/parser@7.22.5: + resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.0): @@ -632,13 +736,13 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1): + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.5): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.21.5 dev: true @@ -716,13 +820,13 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1): + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.5): resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.21.5 dev: true @@ -740,13 +844,13 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.1): + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.5): resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-module-transforms': 7.22.1 '@babel/helper-plugin-utils': 7.21.5 '@babel/helper-simple-access': 7.21.5 @@ -754,33 +858,33 @@ packages: - supports-color dev: true - /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1): + /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.5): resolution: {integrity: sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.21.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.5) transitivePeerDependencies: - supports-color dev: true - /@babel/preset-typescript@7.21.5(@babel/core@7.22.1): + /@babel/preset-typescript@7.21.5(@babel/core@7.22.5): resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.21.5 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) - '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1) - '@babel/plugin-transform-typescript': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.5) + '@babel/plugin-transform-typescript': 7.22.3(@babel/core@7.22.5) transitivePeerDependencies: - supports-color dev: true @@ -792,8 +896,8 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@babel/runtime@7.22.3: - resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} + /@babel/runtime@7.22.5: + resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -817,6 +921,15 @@ packages: '@babel/types': 7.22.3 dev: true + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 + dev: true + /@babel/traverse@7.21.2: resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} engines: {node: '>=6.9.0'} @@ -853,18 +966,18 @@ packages: - supports-color dev: true - /@babel/traverse@7.22.4: - resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} + /@babel/traverse@7.22.5: + resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.22.3 - '@babel/helper-environment-visitor': 7.22.1 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.22.4 - '@babel/types': 7.22.4 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -889,12 +1002,12 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.22.4: - resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: true @@ -902,25 +1015,25 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@codemirror/autocomplete@6.7.1(@codemirror/language@6.7.0)(@codemirror/state@6.2.1)(@codemirror/view@6.13.0)(@lezer/common@1.0.3): - resolution: {integrity: sha512-hSxf9S0uB+GV+gBsjY1FZNo53e1FFdzPceRfCfD1gWOnV6o21GfB5J5Wg9G/4h76XZMPrF0A6OCK/Rz5+V1egg==} + /@codemirror/autocomplete@6.8.1(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.14.0)(@lezer/common@1.0.3): + resolution: {integrity: sha512-HpphvDcTdOx+9R3eUw9hZK9JA77jlaBF0kOt2McbyfvY0rX9pnMoO8rkkZc0GzSbzhIY4m5xJ0uHHgjfqHNmXQ==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/common': ^1.0.0 dependencies: - '@codemirror/language': 6.7.0 + '@codemirror/language': 6.8.0 '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 '@lezer/common': 1.0.3 dev: false - /@codemirror/lang-css@6.2.0(@codemirror/view@6.13.0): + /@codemirror/lang-css@6.2.0(@codemirror/view@6.14.0): resolution: {integrity: sha512-oyIdJM29AyRPM3+PPq1I2oIk8NpUfEN3kAM05XWDDs6o3gSneIKaVJifT2P+fqONLou2uIgXynFyMUDQvo/szA==} dependencies: - '@codemirror/autocomplete': 6.7.1(@codemirror/language@6.7.0)(@codemirror/state@6.2.1)(@codemirror/view@6.13.0)(@lezer/common@1.0.3) - '@codemirror/language': 6.7.0 + '@codemirror/autocomplete': 6.8.1(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.14.0)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 '@codemirror/state': 6.2.1 '@lezer/common': 1.0.3 '@lezer/css': 1.1.2 @@ -928,15 +1041,15 @@ packages: - '@codemirror/view' dev: false - /@codemirror/lang-html@6.4.4: - resolution: {integrity: sha512-NbrqEp0GUOSvhZbG6BxVcS4SzM4SvN5vkkD2sEoETHIyHLZDb9pO1z+r1L2heb6LuF4bUeBCXKjHXoSeDJHO1w==} + /@codemirror/lang-html@6.4.5: + resolution: {integrity: sha512-dUCSxkIw2G+chaUfw3Gfu5kkN83vJQN8gfQDp9iEHsIZluMJA0YJveT12zg/28BJx+uPsbQ6VimKCgx3oJrZxA==} dependencies: - '@codemirror/autocomplete': 6.7.1(@codemirror/language@6.7.0)(@codemirror/state@6.2.1)(@codemirror/view@6.13.0)(@lezer/common@1.0.3) - '@codemirror/lang-css': 6.2.0(@codemirror/view@6.13.0) + '@codemirror/autocomplete': 6.8.1(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.14.0)(@lezer/common@1.0.3) + '@codemirror/lang-css': 6.2.0(@codemirror/view@6.14.0) '@codemirror/lang-javascript': 6.1.9 - '@codemirror/language': 6.7.0 + '@codemirror/language': 6.8.0 '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 '@lezer/common': 1.0.3 '@lezer/css': 1.1.2 '@lezer/html': 1.3.4 @@ -945,11 +1058,11 @@ packages: /@codemirror/lang-javascript@6.1.9: resolution: {integrity: sha512-z3jdkcqOEBT2txn2a87A0jSy6Te3679wg/U8QzMeftFt+4KA6QooMwfdFzJiuC3L6fXKfTXZcDocoaxMYfGz0w==} dependencies: - '@codemirror/autocomplete': 6.7.1(@codemirror/language@6.7.0)(@codemirror/state@6.2.1)(@codemirror/view@6.13.0)(@lezer/common@1.0.3) - '@codemirror/language': 6.7.0 - '@codemirror/lint': 6.2.2 + '@codemirror/autocomplete': 6.8.1(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.14.0)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@codemirror/lint': 6.3.0 '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 '@lezer/common': 1.0.3 '@lezer/javascript': 1.4.3 dev: false @@ -957,30 +1070,30 @@ packages: /@codemirror/lang-markdown@6.1.1: resolution: {integrity: sha512-n87Ms6Y5UYb1UkFu8sRzTLfq/yyF1y2AYiWvaVdbBQi5WDj1tFk5N+AKA+WC0Jcjc1VxvrCCM0iizjdYYi9sFQ==} dependencies: - '@codemirror/lang-html': 6.4.4 - '@codemirror/language': 6.7.0 + '@codemirror/lang-html': 6.4.5 + '@codemirror/language': 6.8.0 '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 '@lezer/common': 1.0.3 - '@lezer/markdown': 1.0.2 + '@lezer/markdown': 1.0.3 dev: false - /@codemirror/language@6.7.0: - resolution: {integrity: sha512-4SMwe6Fwn57klCUsVN0y4/h/iWT+XIXFEmop2lIHHuWO0ubjCrF3suqSZLyOQlznxkNnNbOOfKe5HQbQGCAmTg==} + /@codemirror/language@6.8.0: + resolution: {integrity: sha512-r1paAyWOZkfY0RaYEZj3Kul+MiQTEbDvYqf8gPGaRvNneHXCmfSaAVFjwRUPlgxS8yflMxw2CTu6uCMp8R8A2g==} dependencies: '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 '@lezer/common': 1.0.3 '@lezer/highlight': 1.1.6 - '@lezer/lr': 1.3.6 + '@lezer/lr': 1.3.7 style-mod: 4.0.3 dev: false - /@codemirror/lint@6.2.2: - resolution: {integrity: sha512-kHGuynBHjqinp1Bx25D2hgH8a6Fh1m9rSmZFzBVTqPIXDIcZ6j3VI67DY8USGYpGrjrJys9R52eLxtfERGNozg==} + /@codemirror/lint@6.3.0: + resolution: {integrity: sha512-tzxOVQNoDhhwFNfcTO2IB74wQoWarARcH6gv3YufPpiJ9yhcb7zD6JCkO5+FWARskqRFc8GFa6E+wUyOvADl5A==} dependencies: '@codemirror/state': 6.2.1 - '@codemirror/view': 6.13.0 + '@codemirror/view': 6.14.0 crelt: 1.0.6 dev: false @@ -988,8 +1101,8 @@ packages: resolution: {integrity: sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==} dev: false - /@codemirror/view@6.13.0: - resolution: {integrity: sha512-oXTfJzHJ5Tl7f6T8ZO0HKf981zubxgKohjddLobbntbNZHlOZGMRL+pPZGtclDWFaFJWtGBYRGyNdjQ6Xsx5yA==} + /@codemirror/view@6.14.0: + resolution: {integrity: sha512-I263FPs4In42MNmrdwN2DfmYPFMVMXgT7o/mxdGp4jv5LPs8i0FOxzmxF5yeeQdYSTztb2ZhmPIu0ahveInVTg==} dependencies: '@codemirror/state': 6.2.1 style-mod: 4.0.3 @@ -1302,7 +1415,7 @@ packages: resolution: {integrity: sha512-5TKMAReXukfEmIiZprDlGfZVfOOCyEStFi1YLzxclm9H3G/HHI49/2wzlRT6bQw5r7PoZVEtjTItEkb/UuZQyg==} dependencies: '@lezer/highlight': 1.1.6 - '@lezer/lr': 1.3.6 + '@lezer/lr': 1.3.7 dev: false /@lezer/highlight@1.1.6: @@ -1316,14 +1429,14 @@ packages: dependencies: '@lezer/common': 1.0.3 '@lezer/highlight': 1.1.6 - '@lezer/lr': 1.3.6 + '@lezer/lr': 1.3.7 dev: false /@lezer/javascript@1.4.3: resolution: {integrity: sha512-k7Eo9z9B1supZ5cCD4ilQv/RZVN30eUQL+gGbr6ybrEY3avBAL5MDiYi2aa23Aj0A79ry4rJRvPAwE2TM8bd+A==} dependencies: '@lezer/highlight': 1.1.6 - '@lezer/lr': 1.3.6 + '@lezer/lr': 1.3.7 dev: false /@lezer/lr@0.15.8: @@ -1332,14 +1445,14 @@ packages: '@lezer/common': 0.15.12 dev: true - /@lezer/lr@1.3.6: - resolution: {integrity: sha512-IDhcWjfxwWACnatUi0GzWBCbochfqxo3LZZlS27LbJh8RVYYXXyR5Ck9659IhkWkhSW/kZlaaiJpUO+YZTUK+Q==} + /@lezer/lr@1.3.7: + resolution: {integrity: sha512-ssHKb3p0MxhJXT2i7UBmgAY1BIM3Uq/D772Qutu3EVmxWIyNMU12nQ0rL3Fhu+MiFtiTzyTmd3xGwEf3ON5PSA==} dependencies: '@lezer/common': 1.0.3 dev: false - /@lezer/markdown@1.0.2: - resolution: {integrity: sha512-8CY0OoZ6V5EzPjSPeJ4KLVbtXdLBd8V6sRCooN5kHnO28ytreEGTyrtU/zUwo/XLRzGr/e1g44KlzKi3yWGB5A==} + /@lezer/markdown@1.0.3: + resolution: {integrity: sha512-QEcXFCKf1TBdVhmxL2V9afJTIs4w795DTl2NKnsYZyMOtMsA+5AlEy0biPo/Ojv05ELkk6HIPSDBj0g+ShlkBw==} dependencies: '@lezer/common': 1.0.3 '@lezer/highlight': 1.1.6 @@ -1471,85 +1584,85 @@ packages: fastq: 1.15.0 dev: true - /@parcel/bundler-default@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-gNTaSQpp7jiFvkQ/P/KfAiVLT3UOEs5bBivQm4OMdgSi2DTIsjGMQVQ7JDzvzEzrHiFlDmdXKxUagex54pOtJg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/bundler-default@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-tmhyeNQYJla9509Sq/U12j2fZg0hDojyIyM4wuVWKhkAnDnZjbMKj3m11S1COR5i2aqx9lJjTWj0XPJl5lrcvg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/graph': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/graph': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/cache@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-2aFWUAi7vkcnIdfOw3oW/vhgvwv9MPb+LjmJSkE59nNUuSJe83jJFAPAhqQTHd9L3kX/Xk+xJBNYNubUq/Cieg==} + /@parcel/cache@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-Bde9HmxaO+H5qPbcxBl/JzzZ/7ewoHFDWLOQ4zdfyh+q4IyLS257WAUGm4x6BeNjc1S7YjoelEbBKdgw8mQOig==} engines: {node: '>= 12.0.0'} peerDependencies: - '@parcel/core': ^2.9.1 + '@parcel/core': ^2.9.2 dependencies: - '@parcel/core': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/logger': 2.9.1 - '@parcel/utils': 2.9.1 + '@parcel/core': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/logger': 2.9.2 + '@parcel/utils': 2.9.2 lmdb: 2.7.11 dev: true - /@parcel/codeframe@2.9.1: - resolution: {integrity: sha512-qLVIyEHuZq8wWYaXVAwxMzlK3QqWlaB5fUSe1n+kITEa9EEwb2WPmysYAsWiVaFdD62A0+1klJ8Sq9gapOMIng==} + /@parcel/codeframe@2.9.2: + resolution: {integrity: sha512-+T1POu9uU2tkPi3P25ojtU3CKoGYfirc2bE/1iNyvbuEtpkAzl9UQFXphGqFyuJSI429mP2pWL8SeKG0b5zaUw==} engines: {node: '>= 12.0.0'} dependencies: chalk: 4.1.2 dev: true - /@parcel/compressor-raw@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-aUkZ0pOzGjQ9kyaUQ/suDVmU5lR4mT9fU5HXlp3hGD7MWh2HFJUOfQ3gp5g3P9x+MeVZKU+ht6UcIMhrzelLGQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/compressor-raw@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-QRrxyiztMjk8Tt4AmP1ibgH7bRrAcrWCjTY/W1wa0fCkEn2QyCg20BGxONg280qXTQD4x2N98X4B3ctAPAxpDw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/config-default@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-oH6NHKaKp2YBHOcQJxwHGPbgGCZZZH1I4eef+KRBFiabgiDQxHLni+vg+c+mErd8lFrNn2gcGIdKzQwWqavT+w==} + /@parcel/config-default@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-dRqUKn6YIKTxvKbfO5xfxzMhOMWMCNoZzEWuP/bESW6zXI8krdGmgdu6HxSfCmvPnkz+0SAz8ig2QnjV0KtCcw==} peerDependencies: - '@parcel/core': ^2.9.1 - dependencies: - '@parcel/bundler-default': 2.9.1(@parcel/core@2.9.1) - '@parcel/compressor-raw': 2.9.1(@parcel/core@2.9.1) - '@parcel/core': 2.9.1 - '@parcel/namer-default': 2.9.1(@parcel/core@2.9.1) - '@parcel/optimizer-css': 2.9.1(@parcel/core@2.9.1) - '@parcel/optimizer-htmlnano': 2.9.1(@parcel/core@2.9.1) - '@parcel/optimizer-image': 2.9.1(@parcel/core@2.9.1) - '@parcel/optimizer-svgo': 2.9.1(@parcel/core@2.9.1) - '@parcel/optimizer-swc': 2.9.1(@parcel/core@2.9.1) - '@parcel/packager-css': 2.9.1(@parcel/core@2.9.1) - '@parcel/packager-html': 2.9.1(@parcel/core@2.9.1) - '@parcel/packager-js': 2.9.1(@parcel/core@2.9.1) - '@parcel/packager-raw': 2.9.1(@parcel/core@2.9.1) - '@parcel/packager-svg': 2.9.1(@parcel/core@2.9.1) - '@parcel/reporter-dev-server': 2.9.1(@parcel/core@2.9.1) - '@parcel/resolver-default': 2.9.1(@parcel/core@2.9.1) - '@parcel/runtime-browser-hmr': 2.9.1(@parcel/core@2.9.1) - '@parcel/runtime-js': 2.9.1(@parcel/core@2.9.1) - '@parcel/runtime-react-refresh': 2.9.1(@parcel/core@2.9.1) - '@parcel/runtime-service-worker': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-babel': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-css': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-html': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-image': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-js': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-json': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-postcss': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-posthtml': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-raw': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-react-refresh-wrap': 2.9.1(@parcel/core@2.9.1) - '@parcel/transformer-svg': 2.9.1(@parcel/core@2.9.1) + '@parcel/core': ^2.9.2 + dependencies: + '@parcel/bundler-default': 2.9.2(@parcel/core@2.9.2) + '@parcel/compressor-raw': 2.9.2(@parcel/core@2.9.2) + '@parcel/core': 2.9.2 + '@parcel/namer-default': 2.9.2(@parcel/core@2.9.2) + '@parcel/optimizer-css': 2.9.2(@parcel/core@2.9.2) + '@parcel/optimizer-htmlnano': 2.9.2(@parcel/core@2.9.2) + '@parcel/optimizer-image': 2.9.2(@parcel/core@2.9.2) + '@parcel/optimizer-svgo': 2.9.2(@parcel/core@2.9.2) + '@parcel/optimizer-swc': 2.9.2(@parcel/core@2.9.2) + '@parcel/packager-css': 2.9.2(@parcel/core@2.9.2) + '@parcel/packager-html': 2.9.2(@parcel/core@2.9.2) + '@parcel/packager-js': 2.9.2(@parcel/core@2.9.2) + '@parcel/packager-raw': 2.9.2(@parcel/core@2.9.2) + '@parcel/packager-svg': 2.9.2(@parcel/core@2.9.2) + '@parcel/reporter-dev-server': 2.9.2(@parcel/core@2.9.2) + '@parcel/resolver-default': 2.9.2(@parcel/core@2.9.2) + '@parcel/runtime-browser-hmr': 2.9.2(@parcel/core@2.9.2) + '@parcel/runtime-js': 2.9.2(@parcel/core@2.9.2) + '@parcel/runtime-react-refresh': 2.9.2(@parcel/core@2.9.2) + '@parcel/runtime-service-worker': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-babel': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-css': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-html': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-image': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-js': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-json': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-postcss': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-posthtml': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-raw': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-react-refresh-wrap': 2.9.2(@parcel/core@2.9.2) + '@parcel/transformer-svg': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@swc/helpers' - cssnano @@ -1561,144 +1674,144 @@ packages: - uncss dev: true - /@parcel/core@2.9.1: - resolution: {integrity: sha512-D/7iyRV5c8kYMV1JGkokktxh3ON5CMvNAllaBucl4SMatAyLo5aLjGG5ey6FD/4Tv+JJ6NsldLtkvciDVJdgFQ==} + /@parcel/core@2.9.2: + resolution: {integrity: sha512-Qwn9Fp85gchfDq94chr+of9+xgWQP0G48chP+J/PmZ3TP29sOZ9NsVf+qiGO47UAeNnamBRPeMXyK/Nvv0zQdg==} engines: {node: '>= 12.0.0'} dependencies: '@mischnic/json-sourcemap': 0.1.0 - '@parcel/cache': 2.9.1(@parcel/core@2.9.1) - '@parcel/diagnostic': 2.9.1 - '@parcel/events': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/graph': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/logger': 2.9.1 - '@parcel/package-manager': 2.9.1(@parcel/core@2.9.1) - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/profiler': 2.9.1 + '@parcel/cache': 2.9.2(@parcel/core@2.9.2) + '@parcel/diagnostic': 2.9.2 + '@parcel/events': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/graph': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/logger': 2.9.2 + '@parcel/package-manager': 2.9.2(@parcel/core@2.9.2) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/profiler': 2.9.2 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) abortcontroller-polyfill: 1.7.5 base-x: 3.0.9 - browserslist: 4.21.5 + browserslist: 4.21.9 clone: 2.1.2 dotenv: 7.0.0 dotenv-expand: 5.1.0 json5: 2.2.3 - msgpackr: 1.8.5 + msgpackr: 1.9.5 nullthrows: 1.1.1 semver: 5.7.1 dev: true - /@parcel/diagnostic@2.9.1: - resolution: {integrity: sha512-LM+w4maoAsjcL+javaHw9B9oEQoLdg/fMCNbuTmAKpQWi16hfNkr4+xz7AxxwL3dCcL7uuvVgoUOUubwxWNLAA==} + /@parcel/diagnostic@2.9.2: + resolution: {integrity: sha512-cHvQ3GtC0dJixtt5Ne1SG0vogt6PE9Fu2KmrFMLcL57rowi3sl+W+Lh02sujd/V0ZQOSRV01WdXJXDsiI/na8g==} engines: {node: '>= 12.0.0'} dependencies: '@mischnic/json-sourcemap': 0.1.0 nullthrows: 1.1.1 dev: true - /@parcel/events@2.9.1: - resolution: {integrity: sha512-tga4FiJB1TC4iOKBK66e9zXpcDFXvJhXmsgOMsgSTM6uCZMXeGaYEixHNlPDs3HTfg17qAmHHlhfgPBbku/aOg==} + /@parcel/events@2.9.2: + resolution: {integrity: sha512-aDKq9gl8vK/LTTsAs3k8wBsFYVQ8NOSa0aC0Thq+l5KRN04U/ljNiDVmxDkwJgAvT0Iv62kT9ooBl6aQPUWNyQ==} engines: {node: '>= 12.0.0'} dev: true - /@parcel/fs-search@2.9.1: - resolution: {integrity: sha512-F7SkVsMb5XYcWmeptLz5D3g76Raed3dmNulJMrWIECP8lJ1LUcCExQId7NsdeCfRbNRwaf84gdsjc/1GKM/QYg==} + /@parcel/fs-search@2.9.2: + resolution: {integrity: sha512-PP1aFLaH5rk8mF8AN62/R68Ne9Xq/VNhj3h1BxdESiHkhRIrM1ZcQ4t4WBaMjPaLXi1jSKLQ8fY50QBVIJKy4Q==} engines: {node: '>= 12.0.0'} dev: true - /@parcel/fs@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-F/GRHtHN4AuTauadsq/UQ1OSpLBLAS/96Sv1x09/AKZxNlZ2UzWExoYEhSkVM5smKVzSnx8XP9OqABcHcZwOLQ==} + /@parcel/fs@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-URKchUywNyoOIcOsmwcxr8gp+CBVjD502Fb6RhAdFhdZV2o3X2BLTGf03fQzSSJ0IDO3jKUTK0UUg/Mz8Vd3Rw==} engines: {node: '>= 12.0.0'} peerDependencies: - '@parcel/core': ^2.9.1 + '@parcel/core': ^2.9.2 dependencies: - '@parcel/core': 2.9.1 - '@parcel/fs-search': 2.9.1 - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/core': 2.9.2 + '@parcel/fs-search': 2.9.2 + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 '@parcel/watcher': 2.1.0 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) dev: true - /@parcel/graph@2.9.1: - resolution: {integrity: sha512-fc/Yk1XPzo3ZHhKS7l5aETAEBpnF0nK+0TawkNrQ2rcL21MG1kHNYSR8uBwOqyXmBSMEItals5Ixgd8fWa+9PQ==} + /@parcel/graph@2.9.2: + resolution: {integrity: sha512-2lraupLwe6JTzy4KFOsFphV6/Fn3OF6PUOnHY2oQhHdBzWw43a0cbVpyIn8ChvXKlB3YqdId6X7oOutbmh3X8A==} engines: {node: '>= 12.0.0'} dependencies: nullthrows: 1.1.1 dev: true - /@parcel/hash@2.9.1: - resolution: {integrity: sha512-fiqAIi/23h5tnH5W7DRTwOhfRPhadHvI7hYoG8YFGvnFxSQ/XCnOID0B0/vNhaluICSPeFcedjAmDVdqY6/X7w==} + /@parcel/hash@2.9.2: + resolution: {integrity: sha512-zXjg3BTxevsTe2Ylqsmm2Cw6gcIObaSz2dBjeRXO3LM8ziXJ4c7tOBKIXHPcnc2JmOyp3pmFB1sQaE+qXKh0DQ==} engines: {node: '>= 12.0.0'} dependencies: xxhash-wasm: 0.4.2 dev: true - /@parcel/logger@2.9.1: - resolution: {integrity: sha512-wUH9ShrRr3RwNa75ymegDIAdJiY3dGB7HCgIP6VOOc2CGyGA2DJKbbYGfw5mkl3DV8lUV+dYsWYMGXZhInAQCQ==} + /@parcel/logger@2.9.2: + resolution: {integrity: sha512-rhb+CZZ4tKbrH585GTec32qxEpbjqrjaAbBRmyjGknsTleoiazcrLiutE7h+VRItKmv5QG+yPgrZ0PFx83fmhw==} engines: {node: '>= 12.0.0'} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/events': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/events': 2.9.2 dev: true - /@parcel/markdown-ansi@2.9.1: - resolution: {integrity: sha512-FpOz2ltnKnm6QaQCdcpuAEwGuScVUq0ixT/QAmU7A3/cwlsoxqMkB2XeWYIVTjs7p7Bsu0Ctdid/6pdtP7ghpg==} + /@parcel/markdown-ansi@2.9.2: + resolution: {integrity: sha512-2iWqdaQhDEPL11V4TAssghJLZUXwB4RXzCgOEniWv7Hj/3ymXA4VzCyOncRoIqpm4MvxBV3tLPGM7qVqbCzN8Q==} engines: {node: '>= 12.0.0'} dependencies: chalk: 4.1.2 dev: true - /@parcel/namer-default@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-XHpAc5JLQchUqRrYqnUvinReR2nCyiD+DhIedMW5hURwlCPBlfcTVf6M5kSSpjzqRDVKezx3TFF6dzZNv0fBJQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/namer-default@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-7hHEPhSPGnQadQmqghreRpREM8BheEA2BXhpXcemLYhFcCtQwrQUe14laOFy70+E8lK3SRf4QvQKXroHscL3ZQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/node-resolver-core@3.0.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-4owokOoHCONeazQGndB4PkIaUhZfyWuCT7Sx4UJc2UhR1V82MlahHrT2ItT0pkQyKWwCSNgHdBgdKUgKRdIiAw==} + /@parcel/node-resolver-core@3.0.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-fDsELMiEZoMOfqVKQY+BpGA92egLy4rTCC0ra1J+rKpevOubh/qNL2px3+FZUlfsxFO59iaR4qBSjBUzfD3zlg==} engines: {node: '>= 12.0.0'} dependencies: '@mischnic/json-sourcemap': 0.1.0 - '@parcel/diagnostic': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 semver: 5.7.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/optimizer-css@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-IYQpV0kc0KN/aqRAWQsZ8b2pbI4ha4T5HAi27lTGIhQNvEixUtf0gJvCJVSlBxpdMiXVJq9pp97UamoNuB6oig==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/optimizer-css@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-tNkoeCqy6yK21D+EMMWmmUHJL+abwNjhUC3LKJbi7YBrj1DswSaARiFMzLNlNQysa39VtWbo42VD+GV/5F6LAQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 - browserslist: 4.21.5 - lightningcss: 1.19.0 + '@parcel/utils': 2.9.2 + browserslist: 4.21.9 + lightningcss: 1.21.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/optimizer-htmlnano@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-t/e9XsoXZViqOFWcz3LlEClCOYNCjP6MIo+p+WmAuc5+QFF0/9viNqgRbhVe8V1tbtRofxsm4BossFOjOBSjmg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/optimizer-htmlnano@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-PfZ5bK9Xh5Yi6B++cilRDslSnkkzoEldGAAQ4qeX1njT6/VmQcOsG+ZV1lA344sXogu9nhmdjl+TVbpxzrs+Og==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - htmlnano: 2.0.3(svgo@2.8.0) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + htmlnano: 2.0.4(svgo@2.8.0) nullthrows: 1.1.1 posthtml: 0.16.6 svgo: 2.8.0 @@ -1713,227 +1826,237 @@ packages: - uncss dev: true - /@parcel/optimizer-image@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-Ml51RUGbQXyoHZ9yhyal8J/khZeWZX5J8NPOEvkCmmOkxo/qM4CMPIvJStzzn5K7mOPRKUheDkM/QoNGO5gTwA==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/optimizer-image@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-FhYo3j/olcojmDGBxwYXrD1+xzLTulsWosqgs0BpU4E2mGwqpK2IqC+VUs66wKLsCWB3EQStHY1ax7o3ODAmjA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} + peerDependencies: + '@parcel/core': ^2.9.2 dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) - transitivePeerDependencies: - - '@parcel/core' + '@parcel/core': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) dev: true - /@parcel/optimizer-svgo@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-8XHSEIjJfdTFtUQzRiy0K+fbvdcheYc+azdyuJPnIV5AX04k4heKwp7uH328Ylk2k0JkfDyQmjFEyPj9qWDadQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/optimizer-svgo@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-k14TS8IM46Lsffr9MdlSO+/2Np4x1en1viKBfqUHjoJSRwpV12o7Jy81XRTaLekBTe+NvUPem4nzvE1/x+4QKA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 svgo: 2.8.0 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/optimizer-swc@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-bLDkAwkmFE8YZNHcfJNj22haSLXrqjZkGXbPgGDkanCUS52yWv1+OFZ+6frX2q4EdXaTX8nFZSJL4VPHZZiUGQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/optimizer-swc@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-agy/gE70tPoALRapJEbbjP7Q52N3sV0sZDvR83lrmdc+B1KLGPAswGJe/RXyzXfiA76NGlTQTDxrExSbPa9B4Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 - '@swc/core': 1.3.60 + '@parcel/utils': 2.9.2 + '@swc/core': 1.3.66 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' dev: true - /@parcel/package-manager@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-cTUBUPRm62770Vw4YG5WGlkFxJII320nSobbP0TMggE/CGXg3ru2pvvX6WqXTFAHeM/z78xTPDq0NP97DBp5Ow==} + /@parcel/package-manager@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-4/ytXWzm0456gbT93klZNM1CMSqG9SCbJWKk7m5pqy5f8hCYDSrd9Qza+tTynK73cNCHzl4ehS3wsHDhsT+q+Q==} engines: {node: '>= 12.0.0'} peerDependencies: - '@parcel/core': ^2.9.1 - dependencies: - '@parcel/core': 2.9.1 - '@parcel/diagnostic': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/logger': 2.9.1 - '@parcel/node-resolver-core': 3.0.1(@parcel/core@2.9.1) - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/core': ^2.9.2 + dependencies: + '@parcel/core': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/logger': 2.9.2 + '@parcel/node-resolver-core': 3.0.2(@parcel/core@2.9.2) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) semver: 5.7.1 dev: true - /@parcel/packager-css@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-efMShrIwVBY9twZTGQ5QFwl9H3xJg8nSjl/xgOGq9rrbkmcrVlfSgPL9ExNx75EvmOwOKxZjFiMsNYNICPNfgg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/packager-css@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-/FV8KmAONUbbfd0ybuXfD56EIPmMRQJGtKINFK4gRLLFOotgR9NSNoAUsEUxYblodZsC4RbKqwMhPpWdRMhcZg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/packager-html@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-mP7iIwyFDZ21XwD2SlwZoSrvKpS5Amlpi/ywd0dLdwQb5TL+Q2f05IcRNfFbWdVd1AJycDQ85ERokNKN3QPMkg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/packager-html@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-CdOdKc0O6lxdsbnQs+Cai2sBSePvVZty+hUIHf/TeKKiYz1SDu51BEbsH+cppbMl08vbzQcUVkpgaatzaHzUMQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 posthtml: 0.16.6 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/packager-js@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-MmeKdp/obO36M8Y9yYAFiFkdhRFbQtYGSxbMwm2JVtRKMcFmlR5KzqLUg67OX6qgKw5lZZ1TkYhSI0hQQ6+Vqw==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/packager-js@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-BgtouTdfTio4xe+o7pX4ys9+6hpNf70Ae+xEk8elwUhq+u+r1NlM8Iv/irtxIAQNCG0fGMdM4OCZofUQ4DMyvw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 + '@parcel/utils': 2.9.2 globals: 13.20.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/packager-raw@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-qHJ389R5cLgR2PcJt8sOrNBcAY0qpZRMTOMgkc9zYkKy1tdUMgCUuDfO1kShfv4E7rr084mtlu9tK8MXChyF6w==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/packager-raw@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-p7eHwSSGHk8t1SjL72xKZHe8BsfkuixBhLnWVa+hscB0UGeYqIkQ+OQ34+gg9DkcL98Zc0/ZN1qHzsOdhd/2jg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/packager-svg@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-aRzuiwcUlNATfSIbeYpDkJXvwdiAAbiQlxSz6cI53NqWwZn+Dn79WyiKPBST14ij4/P3ZjkcwXevqHpvXP/ArQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/packager-svg@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-ywAk84WtHe+QIPlvKM36oefzfEN1anyj60bldZjzvSFoU2cBkwgtp1F80Do4lXdaaNCSvcLScD37EIVhAD2ASA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 posthtml: 0.16.6 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/plugin@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-kD+BNkPGRcxZZUKhAXqF/bilUMhXUlf/ZixVlBS5rEsUB1yx/Ze8c4ypaKr5WsEwv34C+X4p4WFYdZVJEr3Y+g==} + /@parcel/packager-ts@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-vqVjMTmHA35wEPPXqqkuNykdZh+6g49sT/GZbCJtjJsqmDtVd5AEExgVMpCZ5+ZqPL3VEyjR46uhjrP+1PKvAg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} + dependencies: + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/plugin@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-5v4sdeD5Cft4Vg2D61HW9TK0oi50X2jrm0hVFbUbCG2/TPWs77BMN6Nq+dMV38wEaGbnPjRolxBtRp+ungF09w==} engines: {node: '>= 12.0.0'} dependencies: - '@parcel/types': 2.9.1(@parcel/core@2.9.1) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/profiler@2.9.1: - resolution: {integrity: sha512-hrptwbh9uUxnWHAAXiZ6BtpM74cU+VfrOWgnmUA8pkYWBmrb2wSLeqRKl8FiSt+nfRTTbNAIlmn9vk2x+wRNOA==} + /@parcel/profiler@2.9.2: + resolution: {integrity: sha512-C846buL+bmnP/F360rUp4I9dwkdUkVM+gFe/AK3JCjtA0TZQIysLqntIQ7g6JK8VUa3e9Q8GwmTfncPAFoiaNQ==} engines: {node: '>= 12.0.0'} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/events': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/events': 2.9.2 chrome-trace-event: 1.0.3 dev: true - /@parcel/reporter-cli@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-xzJaaHQwcsmHijlCl7gOAdqU0n6AnW7c7rN8AXDH8BvnOx2v8NC8nCIEmDTOfpQYepcuER2+ilTQ7jpDx/iDhg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/reporter-cli@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-9BSK9FzdrEq0dCfwkuh78ds7hvPn8aY/fLcYwWOaWz2PxjnhmAwpuPMluybQxtfsSGS3gFnSFlnABA+ptEZczQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 chalk: 4.1.2 term-size: 2.2.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/reporter-dev-server@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-Wa9kmtnuYTqEsKakhrSLvZmWxM4TB+Dg2jl1vC3gYfvlsgt/d/Hp/y2giPH1EeCm4wEEQfdAY3WmSUx9p1x07w==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/reporter-dev-server@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-lnspjm17GqeJB2D6e0qbymSv9ssiOnicxUm+slrOkYr5QjGKMffIuxqi822gpE0y4rZmxLDmYO3bsVBO/gxtkg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/reporter-tracer@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-LgZKx9qwBAChWHBcpHW8GJXz45IGtiPmzs6HIDavZOiGqjGVzmbHUKxHnFaRZqR6WznJ+0ay/2o+BrJ8cyXUcg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/reporter-tracer@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-wEe5k4uVVEw6SxtEOP34YXPPj/HSFEQfO2tKbLCOQHp8F+/g4LTnV8pFrWWkpFlyhxHwI9qhOHxPAKv1QjRIBw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 chrome-trace-event: 1.0.3 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/resolver-default@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-Q+knNaRDTbGIGqUnddtWEgpYduVBkDyi/CpxKpi7dP7sVYNJsXwEf82hpjX6/XqotA5dehT63yJkvJ/wxJF1Nw==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/resolver-default@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-aGk0yx4g0ps0PWa/f8jEAtdF5b1I3VFQRnNA5hNYdyTrV3l+vTtzxw4ssahIctqFkCz5J26F/iYsauyZ5SpDgg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/node-resolver-core': 3.0.1(@parcel/core@2.9.1) - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/node-resolver-core': 3.0.2(@parcel/core@2.9.2) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/runtime-browser-hmr@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-C+023FOsrycpBHUgUf7Nv4uN0NrLN3UkeymsAHQlgZD5QQD7+nhG6p9PQ7+HbbEAaGaeO7c/86s2qRUglufNig==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/runtime-browser-hmr@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-TuICC8LicFobsNBPsBXWl0bg7e20jtcA7Eec6ZWNRNQUoE7MNiYIb4Te1Yo9glSirqcoAGolOqqBCRo05QJyew==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/runtime-js@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-caT1s1BqYNFGFAz9ul7uwDf+ZXzipiYYoHphhmT2JFweQmRA1CrMeFCuCQa2exsdu+UQpRbuKd+v5UUS2n0poQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/runtime-js@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-9+a7+pBIKd9ESqykc9HeqaMjfmnnWW9dSxEeo5LAeSfI1rAZeMzkxSsYMtyneFgQGaCyVxjXvEWxJLBUINloQA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/runtime-react-refresh@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-opDW9p3f4gVc1aVdFAyLWTL+2S8rhsPdBQRBHEi4WE2DRe/9lpA12NN5KUUHy88dlIr3wyzmaO2Fts0r/x80zg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/runtime-react-refresh@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-/JUwVwwJ1GLIssYXZxR/stjPxYFo4hOuxgrCnDiLCUQDDY04ivzZnjZM4jZncE4TsfolP0CTkOoz+A211G8gRA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 react-error-overlay: 6.0.9 react-refresh: 0.9.0 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/runtime-service-worker@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-TED4MouYjP7xbU9V7/3rjnmuWbCefrP+OC+eQJG6j3HwKiL92QTZ6trWqdLuxFhtZMXKjwbWaBBbIcELB/PbtQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/runtime-service-worker@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-U/Q+7/WVcqtoXwrqN86Rg6ygiultSAPW6t5OEa6DUsER9A0ytNRJ2PPEgrXXEN7gjkswXRCkfZxitRdbzzk63Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -1946,15 +2069,15 @@ packages: detect-libc: 1.0.3 dev: true - /@parcel/transformer-babel@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-HEU3bavD9Cu0RP5T1ioGLbsOQDqND/SQWal8L2f9HsgwTs2kzmTxYylNccqNjAMj3NnoyXzKMKbZyG8qEuLlpw==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-babel@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-7Xpp5mizzRuRlrIPtlBSLzWHqniXOajrsANlNXHuMDTRmHL5KF9ZdmJdMFspO2lkFN/PiNC7abHJ4IigtKYPfQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 - browserslist: 4.21.5 + '@parcel/utils': 2.9.2 + browserslist: 4.21.9 json5: 2.2.3 nullthrows: 1.1.1 semver: 5.7.1 @@ -1962,28 +2085,28 @@ packages: - '@parcel/core' dev: true - /@parcel/transformer-css@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-nT+xOfyveX6qSb088dOh59HWJ1gm7DAIQZPbjTa1wLzRQul8ysdQRf/loulBmtUheol7YwQtVvUHN2XgoMDCAw==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-css@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-jX/A8BmTyJFtNtaIlj/6jXX8/TiVGAFwcFRbQOpwlio2HL/NgdDgeVCEyWMSMumQm5FlnfONl29jBmHS7Q2xVw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 - browserslist: 4.21.5 - lightningcss: 1.19.0 + '@parcel/utils': 2.9.2 + browserslist: 4.21.9 + lightningcss: 1.21.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/transformer-html@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-pIkJbcB91Dl2RyZmVd9neGkf7XJeYXwgx0et5hktw+3m0S2QB399OjVWwi5Q6ZdtTrWkQnHLmbeHT3NOmNWlaw==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-html@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-w883gggwb2AL8PnH7/87pwGMmR3dO/kctwxm/DO83yEXjfkUBB0u1ruYNSuhBFuNAQsrYobC54QrJ/ERcTB96w==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) nullthrows: 1.1.1 posthtml: 0.16.6 posthtml-parser: 0.10.2 @@ -1994,56 +2117,56 @@ packages: - '@parcel/core' dev: true - /@parcel/transformer-image@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-3D4zEavCM1i354ZgJWg7RBNgASA7Q2iHN374lH5hT6I7VAJzNT+PTNrPNQ4vKhi69r+i1sQQzsPdgEUXOExmbQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-image@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-0ZH1Lyob6P28DE6gVizPDbWWCORF/5exQJzjmeFrpUTJep/Aep0bwboYlNUTGrO5phjMp1/aIyzGDqbVhTHhBw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} peerDependencies: - '@parcel/core': ^2.9.1 + '@parcel/core': ^2.9.2 dependencies: - '@parcel/core': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/core': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) nullthrows: 1.1.1 dev: true - /@parcel/transformer-js@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-7hlbAIufIvx6iPspfZ3v1g2cmtpaNEaC04RzRv8HVVru8TE868yplFI840ZBnF5ylOfmxwFTUjlphVtVcPs13A==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-js@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-d4JkEEPh99ON345dhkBc9pAqlM/jXgtQ1K7IW/P8Shd6Z+1vdVkGiTMWH9KNXob/fBm511UvbIhJtmj68MUfug==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} peerDependencies: - '@parcel/core': ^2.9.1 + '@parcel/core': ^2.9.2 dependencies: - '@parcel/core': 2.9.1 - '@parcel/diagnostic': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/core': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.9.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/utils': 2.9.2 + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) '@swc/helpers': 0.5.1 - browserslist: 4.21.5 + browserslist: 4.21.9 nullthrows: 1.1.1 regenerator-runtime: 0.13.11 semver: 5.7.1 dev: true - /@parcel/transformer-json@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-yFRSz1qVbdCssC65D37Ru3diQk7GQl5ZOOyQ7MeMYlhvl8mcFKGRC3wUAyqBZrh70VOWuWR7WS2XLdqTdE9WqQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-json@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-V4SfaBBYHKhFXvORAeUEn3SHyIXevlN4VKKU2838SokHoJ7FbJUXv5QjSS9Fgc8JBeAyIilFoHKQ3CdKI+29qA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/transformer-postcss@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-sNSJbdT4Z8H+/cZ/vCmos44SfbB9O5gNgMEgGa6WqU7MV7cVlnE8zuNJkxR97ZZTpIXNrfVerOY3lOrUrFCxdA==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-postcss@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-zkP7Th+MyGJnUXS0aPJCMCMI6wUL6kV4zPuNu59hDLIcm4+H8qeq0s6UyCOIdxjdhHxWKQxKFmlRiPJ9bs0hxg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/diagnostic': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 clone: 2.1.2 nullthrows: 1.1.1 postcss-value-parser: 4.2.0 @@ -2052,12 +2175,12 @@ packages: - '@parcel/core' dev: true - /@parcel/transformer-posthtml@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-I6fr6lVAqjDxdkOwxelx7FibMWP55JPf3ZTXKCWpoIGkOuT2i2tYZMdXEHVshZWJmByelbYSC96w8P8rSY+6XQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-posthtml@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-z4I+FDL13XFHCH32BqryXN9HcocG9a0KyfTPIphJrtBRGW8lR9rX4rukp8X3gGZIdYMuRMvU4jj6BpPRYJzzXA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 posthtml: 0.16.6 posthtml-parser: 0.10.2 @@ -2067,33 +2190,33 @@ packages: - '@parcel/core' dev: true - /@parcel/transformer-raw@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-Wr0Y9fETiyF5ntL3yhn/ZXjcnswcn1T9YLXa+yAxpAxKW+/D7A1jKVS0tyDOZsdakWA9gzlLP6w1O4Nl8pVmEg==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-raw@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-0Lo44e4KX7lKGLnnOe52JvtptGTLl1kV3UACbOATApR1Rklte0RfNFxL/TRymic7wxRwt/aAXKhZCzFHmJp5Hg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/transformer-react-refresh-wrap@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-ML+KDvLoZ6O+9r3/yf8DeVtobhYc9DPXYHZ75aXoFyou97I9WDf4EqlY4/MSkbZV79FUXxC68dyLJj3Q9ILqeA==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-react-refresh-wrap@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-y2GPoIG7fjizqXq3xl6vvDeGSsOJGcPqm/WvbaxekR1+Yl/U5T4vAD0CaC8EJcVyostCT3G835DdNX7O7rkW/w==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 react-refresh: 0.9.0 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/transformer-svg@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-DYcUfutjtghPXMVybFygncIKJl/4rrpQMxv8yTVeDtplUTvFzbI+3hIoYfYm8z9CXaSBzsCw2Kud6PD8Ob2AzQ==} - engines: {node: '>= 12.0.0', parcel: ^2.9.1} + /@parcel/transformer-svg@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-R9YTE9T7UcwtrZY7LNO4qAhgByqn7mSyt5/cEFN925XtlLSt0TsX2A4cv4s28hGsaABWGB0WL4IAbgATwbOq7w==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} dependencies: - '@parcel/diagnostic': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/plugin': 2.9.1(@parcel/core@2.9.1) + '@parcel/diagnostic': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) nullthrows: 1.1.1 posthtml: 0.16.6 posthtml-parser: 0.10.2 @@ -2103,29 +2226,56 @@ packages: - '@parcel/core' dev: true - /@parcel/types@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-LBx4Tvr1sK9t+FmPjS4jPvcmUcJo6co22sn0pBuz2oXISs/YK2N+3ZHXL+KsozKvLn2wXysgaWFIARN9xFoORw==} + /@parcel/transformer-typescript-types@2.9.2(@parcel/core@2.9.2)(typescript@5.0.4): + resolution: {integrity: sha512-DCWx42Lg2XqwXf90TFCD+uV44GYat69NkTPvilrcr3gws/4y3l978cYu0Q0FShOLWOfteTWWuL+sD0fDIBZDKQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.2} + peerDependencies: + typescript: '>=3.0.0' + dependencies: + '@parcel/diagnostic': 2.9.2 + '@parcel/plugin': 2.9.2(@parcel/core@2.9.2) + '@parcel/source-map': 2.1.1 + '@parcel/ts-utils': 2.9.2(typescript@5.0.4) + '@parcel/utils': 2.9.2 + nullthrows: 1.1.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/ts-utils@2.9.2(typescript@5.0.4): + resolution: {integrity: sha512-Julkwe/iJ/CWrL+/s0L/LUq7FWyB0bRvd7G1qnL1cGjCuspD6qSp6Ko4xLmSYakco8FTlIU8VRbRTBs9UHOIEQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + typescript: '>=3.0.0' dependencies: - '@parcel/cache': 2.9.1(@parcel/core@2.9.1) - '@parcel/diagnostic': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/package-manager': 2.9.1(@parcel/core@2.9.1) + nullthrows: 1.1.1 + typescript: 5.0.4 + dev: true + + /@parcel/types@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-i8WOfWuvBQ88Q0frgJOmIPOZDUZ6BaGtyq+seo0B1Y0Bt04/KF4qPFo9E1umpL8ZgtA1kMtyZd1gsSmXLP5COw==} + dependencies: + '@parcel/cache': 2.9.2(@parcel/core@2.9.2) + '@parcel/diagnostic': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/package-manager': 2.9.2(@parcel/core@2.9.2) '@parcel/source-map': 2.1.1 - '@parcel/workers': 2.9.1(@parcel/core@2.9.1) + '@parcel/workers': 2.9.2(@parcel/core@2.9.2) utility-types: 3.10.0 transitivePeerDependencies: - '@parcel/core' dev: true - /@parcel/utils@2.9.1: - resolution: {integrity: sha512-0P/zIvtvLyuzQA4VFMzA8F22lrUyGR+phve/NlBUH+4Tn+Rt/evh9fP9vG1YTVMXWd90tesLdrtqatm1hqrJSA==} + /@parcel/utils@2.9.2: + resolution: {integrity: sha512-Gvl23c54ZYmBmXqpk7Kbw1S6+taWncgdqTo+XaokOzh3jjih1bmMVSMS+CwtBrYhPZ32x84JNeOxsxz01zsrAA==} engines: {node: '>= 12.0.0'} dependencies: - '@parcel/codeframe': 2.9.1 - '@parcel/diagnostic': 2.9.1 - '@parcel/hash': 2.9.1 - '@parcel/logger': 2.9.1 - '@parcel/markdown-ansi': 2.9.1 + '@parcel/codeframe': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/hash': 2.9.2 + '@parcel/logger': 2.9.2 + '@parcel/markdown-ansi': 2.9.2 '@parcel/source-map': 2.1.1 chalk: 4.1.2 nullthrows: 1.1.1 @@ -2142,18 +2292,18 @@ packages: node-gyp-build: 4.6.0 dev: true - /@parcel/workers@2.9.1(@parcel/core@2.9.1): - resolution: {integrity: sha512-24R4IRMX8TBghak6pDCzM5B8NB4LTt0pI4dwNqSENyZA/Q5s/xMbG5gdn4aTwkAyIQ5lHrgDsHzoHbjOT0HLYQ==} + /@parcel/workers@2.9.2(@parcel/core@2.9.2): + resolution: {integrity: sha512-38jd6jWMPNx41gWSJVtdRiTfE+6TvLfM35mkGg3ykpESk8QwwumaV2CLgvdfnFjxeUlRtOGi8m+bWiWqKJetww==} engines: {node: '>= 12.0.0'} peerDependencies: - '@parcel/core': ^2.9.1 - dependencies: - '@parcel/core': 2.9.1 - '@parcel/diagnostic': 2.9.1 - '@parcel/logger': 2.9.1 - '@parcel/profiler': 2.9.1 - '@parcel/types': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/core': ^2.9.2 + dependencies: + '@parcel/core': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/logger': 2.9.2 + '@parcel/profiler': 2.9.2 + '@parcel/types': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 nullthrows: 1.1.1 dev: true @@ -2214,8 +2364,8 @@ packages: - supports-color dev: true - /@remix-run/router@1.6.2: - resolution: {integrity: sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==} + /@remix-run/router@1.6.3: + resolution: {integrity: sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q==} engines: {node: '>=14'} dev: false @@ -2307,8 +2457,8 @@ packages: '@sinonjs/commons': 2.0.0 dev: true - /@swc/core-darwin-arm64@1.3.60: - resolution: {integrity: sha512-oCDKWGdSO1WyErduGfiITRDoq7ZBt9PXETlhi8BGKH/wCc/3mfSNI9wXAg3Stn8mrT0lUJtdsnwMI/eZp6dK+A==} + /@swc/core-darwin-arm64@1.3.66: + resolution: {integrity: sha512-UijJsvuLy73vxeVYEy7urIHksXS+3BdvJ9s9AY+bRMSQW483NO7RLp8g4FdTyJbRaN0BH15SQnY0dcjQBkVuHw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -2316,8 +2466,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.60: - resolution: {integrity: sha512-pcE/1oUlmN/BkKndOPtViqTkaM5pomagXATo+Muqn4QNMnkSOEVcmF9T3Lr3nB1A7O/fwCew3/aHwZ5B2TZ1tA==} + /@swc/core-darwin-x64@1.3.66: + resolution: {integrity: sha512-xGsHKvViQnwTNLF30Y/5OqWdnN6RsiyUI8awZXfz1sHcXCEaLe+v+WLQ+/E8sgw0YUkYVHzzfV/sAN2CezJK5Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -2325,8 +2475,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.60: - resolution: {integrity: sha512-Moc+86SWcbPr06PaQYUb0Iwli425F7QgjwTCNEPYA6OYUsjaJhXMaHViW2WdGIXue2+eaQbg31BHQd14jXcoBg==} + /@swc/core-linux-arm-gnueabihf@1.3.66: + resolution: {integrity: sha512-gNbLcSIV2pq90BkMSpzvK4xPXOl8GEF3YR4NaqF0CYSzQsVXXTTqMuX/r26xNYudBKzH0345S1MpoRk2qricnA==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -2334,8 +2484,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.60: - resolution: {integrity: sha512-pPGZrTgSXBvp6IrXPXz8UJr82AElf8hMuK4rNHmLGDCqrWnRIFLUpiAsc2WCFIgdwqitZNQoM+F2vbceA/bkKg==} + /@swc/core-linux-arm64-gnu@1.3.66: + resolution: {integrity: sha512-cJSQ0oplyWbJqy4rzVcnBYLAi6z1QT3QCcR7iAey0aAmCvfRBZJfXlyjggMjn4iosuadkauwCZR1xYNhBDRn7w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2343,8 +2493,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.60: - resolution: {integrity: sha512-HSFQaVUkjWYNsQeymAQ3IPX3csRQvHe6MFyqPfvCCQ4dFlxPvlS7VvNaLnGG+ZW1ek7Lc+hEX+4NGzZKsxDIHA==} + /@swc/core-linux-arm64-musl@1.3.66: + resolution: {integrity: sha512-GDQZpcB9aGxG9PTA2shdIkoMZlGK5omJ8NR49uoBTtLBVYiGeXAwV0U1Uaw8kXEZj9i7wZDkvjzjSaNH3evRsg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2352,8 +2502,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.60: - resolution: {integrity: sha512-WJt/X6HHM3/TszckRA7UKMXec3FHYsB9xswQbIYxN4bfTQodu3Rc8bmpHYtFO7ScMLrhY+RljHLK6wclPvaEXw==} + /@swc/core-linux-x64-gnu@1.3.66: + resolution: {integrity: sha512-lg8E4O/Pd9KfK0lajdinVMuGME8dSv7V9arhEpmlfGE2eXSDCWqDn5Htk5QVBstt9lt1lsRhWHJ/YYc2eQY30Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2361,8 +2511,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.60: - resolution: {integrity: sha512-DGGBqAPUXy/aPMBKokL3osZC9kM97HchiDPuprzwgTMP40YQ3hGCzNJ5jK7sOk9Tc4PEdZ2Igfr9sBHmCrxxQw==} + /@swc/core-linux-x64-musl@1.3.66: + resolution: {integrity: sha512-lo8ZcAO/zL2pZWH+LZIyge8u2MklaeuT6+FpVVpBFktMVdYXbaVtzpvWbgRFBZHvL3SRDF+u8jxjtkXhvGUpTw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2370,8 +2520,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.60: - resolution: {integrity: sha512-wQg/BZPJvp5WpUbsBp7VHjhUh0DfYOPhP6dH67WO9QQ07+DvOk2DR2Bfh0z0ts1k7H/FsAqExWtTDCWMCRJiRQ==} + /@swc/core-win32-arm64-msvc@1.3.66: + resolution: {integrity: sha512-cQoVwBuJY5WkHbfpCOlndNwYr1ZThatRjQQvKy540NUIeAEk9Fa6ozlDBtU75UdaWKtUG6YQ/bWz+KTemheVxw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -2379,8 +2529,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.60: - resolution: {integrity: sha512-nqkd0XIVyGbnBwAxP4GIfx6n45/hAPETpmQYpDSGnucOKFJfvGdFGL81GDG1acPCq/oFtR3tIyTbPpKmJ0N6xQ==} + /@swc/core-win32-ia32-msvc@1.3.66: + resolution: {integrity: sha512-y/FrAIINK4UBeUQQknGlWXEyjo+MBvjF7WkUf2KP7sNr9EHHy8+dXohAGd5Anz0eJrqOM1ZXR/GEjxRp7bGQ1Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -2388,8 +2538,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.60: - resolution: {integrity: sha512-ouw+s22i9PYQpSE7Xc+ZittEyA87jElXABesviSpP+jgHt10sM5KFUpVAeV8DRlxJCXMJJ5AhOdCf4TAtFr+6A==} + /@swc/core-win32-x64-msvc@1.3.66: + resolution: {integrity: sha512-yI64ACzS14qFLrfyO12qW+f/UROTotzDeEbuyJAaPD2IZexoT1cICznI3sBmIfrSt33mVuW8eF5m3AG/NUImzw==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2397,8 +2547,8 @@ packages: dev: true optional: true - /@swc/core@1.3.60: - resolution: {integrity: sha512-dWfic7sVjnrStzGcMWakHd2XPau8UXGPmFUTkx6xGX+DOVtfAQVzG6ZW7ohw/yNcTqI05w6Ser26XMTMGBgXdA==} + /@swc/core@1.3.66: + resolution: {integrity: sha512-Hpf91kH5ly7fHkWnApwryTQryT+TO4kMMPH3WyciUSQOWLE3UuQz1PtETHQQk7PZ/b1QF0qQurJrgfBr5bSKUA==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -2407,22 +2557,22 @@ packages: '@swc/helpers': optional: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.60 - '@swc/core-darwin-x64': 1.3.60 - '@swc/core-linux-arm-gnueabihf': 1.3.60 - '@swc/core-linux-arm64-gnu': 1.3.60 - '@swc/core-linux-arm64-musl': 1.3.60 - '@swc/core-linux-x64-gnu': 1.3.60 - '@swc/core-linux-x64-musl': 1.3.60 - '@swc/core-win32-arm64-msvc': 1.3.60 - '@swc/core-win32-ia32-msvc': 1.3.60 - '@swc/core-win32-x64-msvc': 1.3.60 + '@swc/core-darwin-arm64': 1.3.66 + '@swc/core-darwin-x64': 1.3.66 + '@swc/core-linux-arm-gnueabihf': 1.3.66 + '@swc/core-linux-arm64-gnu': 1.3.66 + '@swc/core-linux-arm64-musl': 1.3.66 + '@swc/core-linux-x64-gnu': 1.3.66 + '@swc/core-linux-x64-musl': 1.3.66 + '@swc/core-win32-arm64-msvc': 1.3.66 + '@swc/core-win32-ia32-msvc': 1.3.66 + '@swc/core-win32-x64-msvc': 1.3.66 dev: true /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.5.0 + tslib: 2.5.3 dev: true /@tootallnate/once@2.0.0: @@ -2537,10 +2687,6 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true @@ -2678,6 +2824,10 @@ packages: sprintf-js: 1.0.3 dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -2803,15 +2953,15 @@ packages: update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /browserslist@4.21.7: - resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001495 - electron-to-chromium: 1.4.425 + caniuse-lite: 1.0.30001507 + electron-to-chromium: 1.4.440 node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.7) + update-browserslist-db: 1.0.11(browserslist@4.21.9) dev: true /bs-logger@0.2.6: @@ -2864,8 +3014,8 @@ packages: resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==} dev: true - /caniuse-lite@1.0.30001495: - resolution: {integrity: sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==} + /caniuse-lite@1.0.30001507: + resolution: {integrity: sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==} dev: true /chalk@2.4.2: @@ -2984,15 +3134,14 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} dependencies: - '@types/parse-json': 4.0.0 import-fresh: 3.3.0 + js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - yaml: 1.10.2 dev: true /crelt@1.0.6: @@ -3184,8 +3333,8 @@ packages: resolution: {integrity: sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==} dev: true - /electron-to-chromium@1.4.425: - resolution: {integrity: sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==} + /electron-to-chromium@1.4.440: + resolution: {integrity: sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==} dev: true /emittery@0.13.1: @@ -3509,15 +3658,15 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /htmlnano@2.0.3(svgo@2.8.0): - resolution: {integrity: sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==} + /htmlnano@2.0.4(svgo@2.8.0): + resolution: {integrity: sha512-WGCkyGFwjKW1GeCBsPYacMvaMnZtFJ0zIRnC2NCddkA+IOEhTqskXrS7lep+3yYZw/nQ3dW1UAX4yA/GJyR8BA==} peerDependencies: - cssnano: ^5.0.11 + cssnano: ^6.0.0 postcss: ^8.3.11 purgecss: ^5.0.0 relateurl: ^0.2.7 srcset: 4.0.0 - svgo: ^2.8.0 + svgo: ^3.0.2 terser: ^5.10.0 uncss: ^0.17.3 peerDependenciesMeta: @@ -3538,7 +3687,7 @@ packages: uncss: optional: true dependencies: - cosmiconfig: 7.1.0 + cosmiconfig: 8.2.0 posthtml: 0.16.6 svgo: 2.8.0 timsort: 0.3.0 @@ -4225,6 +4374,13 @@ packages: esprima: 4.0.1 dev: true + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} @@ -4327,8 +4483,8 @@ packages: immediate: 3.0.6 dev: false - /lightningcss-darwin-arm64@1.19.0: - resolution: {integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==} + /lightningcss-darwin-arm64@1.21.0: + resolution: {integrity: sha512-WcJmVmbNUnCbUqqXV46ZsriFtWJujcPkn+w2cu4R+EgpXuibyTP/gzahmX0gc4RYQxTz2zXIeGx4cF2gr8fLwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] @@ -4336,8 +4492,8 @@ packages: dev: true optional: true - /lightningcss-darwin-x64@1.19.0: - resolution: {integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==} + /lightningcss-darwin-x64@1.21.0: + resolution: {integrity: sha512-xHwMHfcTIHX6fY4YQimI1V/KcbozoNVeKMncZzrp/3NAj0sp3ktxobCj1e0sGqVJMUMaHu/SWvt0mS8jAIhkYw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] @@ -4345,8 +4501,8 @@ packages: dev: true optional: true - /lightningcss-linux-arm-gnueabihf@1.19.0: - resolution: {integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==} + /lightningcss-linux-arm-gnueabihf@1.21.0: + resolution: {integrity: sha512-rk1cr+C2IA1QHvh0QJAPXsQ2vrwCksms7fgfaw43RIERBWa6EEM5p0/1CWhdZ5zrl9veUdY6NRaNGRJjJL0iLw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] @@ -4354,8 +4510,8 @@ packages: dev: true optional: true - /lightningcss-linux-arm64-gnu@1.19.0: - resolution: {integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==} + /lightningcss-linux-arm64-gnu@1.21.0: + resolution: {integrity: sha512-JkOG8K2Y4m5MeP3DlaHOgGDDtHbhbJcN8JcizFN0snUIIru1qxYNWPhAQsEwysuTRY9aANP0nScZJkALpcYmgA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -4363,8 +4519,8 @@ packages: dev: true optional: true - /lightningcss-linux-arm64-musl@1.19.0: - resolution: {integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==} + /lightningcss-linux-arm64-musl@1.21.0: + resolution: {integrity: sha512-4Zx51DbR41neTFMs28CI9cZpX/mF5Urc6pChTio5nZhrz6FC1pRGiwxNJ+G15a/YPvRmPmvQd3Mz1N4WEgbj2A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -4372,8 +4528,8 @@ packages: dev: true optional: true - /lightningcss-linux-x64-gnu@1.19.0: - resolution: {integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==} + /lightningcss-linux-x64-gnu@1.21.0: + resolution: {integrity: sha512-PN33pPK/O3b4qMfWcJ2eis7NLqEkyW2NEh9X4rWfJrBtOnSbgafuYUuEtO5Ylu+dL3oUKc5usB07FGeil3RzeA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -4381,8 +4537,8 @@ packages: dev: true optional: true - /lightningcss-linux-x64-musl@1.19.0: - resolution: {integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==} + /lightningcss-linux-x64-musl@1.21.0: + resolution: {integrity: sha512-S51OT7TRfS5x8aN/8frv/JSXCGm+11VuhM4WCiTqDPjhHUDWd8nwiN/7s5juiwrlrpOxb5UKq21EKDrISoGQpw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -4390,8 +4546,8 @@ packages: dev: true optional: true - /lightningcss-win32-x64-msvc@1.19.0: - resolution: {integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==} + /lightningcss-win32-x64-msvc@1.21.0: + resolution: {integrity: sha512-yW6/ZDJAHrSWtRltH1tr2I+2sn374gK2yclc44HMfpxfjIYgXMUkzqstalloMUQpZFR6M0ltXo5/tuLWoBydGQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -4399,20 +4555,20 @@ packages: dev: true optional: true - /lightningcss@1.19.0: - resolution: {integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==} + /lightningcss@1.21.0: + resolution: {integrity: sha512-HDznZexdDMvC98c79vRE+oW5vFncTlLjJopzK4azReOilq6n4XIscCMhvgiXkstYMM/dCe6FJw0oed06ck8AtA==} engines: {node: '>= 12.0.0'} dependencies: detect-libc: 1.0.3 optionalDependencies: - lightningcss-darwin-arm64: 1.19.0 - lightningcss-darwin-x64: 1.19.0 - lightningcss-linux-arm-gnueabihf: 1.19.0 - lightningcss-linux-arm64-gnu: 1.19.0 - lightningcss-linux-arm64-musl: 1.19.0 - lightningcss-linux-x64-gnu: 1.19.0 - lightningcss-linux-x64-musl: 1.19.0 - lightningcss-win32-x64-msvc: 1.19.0 + lightningcss-darwin-arm64: 1.21.0 + lightningcss-darwin-x64: 1.21.0 + lightningcss-linux-arm-gnueabihf: 1.21.0 + lightningcss-linux-arm64-gnu: 1.21.0 + lightningcss-linux-arm64-musl: 1.21.0 + lightningcss-linux-x64-gnu: 1.21.0 + lightningcss-linux-x64-musl: 1.21.0 + lightningcss-win32-x64-msvc: 1.21.0 dev: true /lines-and-columns@1.2.4: @@ -4525,7 +4681,7 @@ packages: /match-sorter@6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: - '@babel/runtime': 7.22.3 + '@babel/runtime': 7.22.5 remove-accents: 0.4.2 dev: false @@ -4630,6 +4786,12 @@ packages: msgpackr-extract: 3.0.2 dev: true + /msgpackr@1.9.5: + resolution: {integrity: sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -4793,25 +4955,25 @@ packages: engines: {node: '>=6'} dev: true - /parcel@2.9.1: - resolution: {integrity: sha512-LBD+jeCpvnDJ8MeE0ciEns4EZw+WH01qLEKT2O1tW2uHM1njhcWvuc9bx19f8iyE2+8Xwwr2GsGTQgPXKiA/yQ==} + /parcel@2.9.2: + resolution: {integrity: sha512-nTpT/0JIhGW5rKXVnVGHyLBFK/KxteqzsSjQNzeGybiBttnIYRXnM03e2QJX0GWqiS9OtM4rJro04DNHoqx3Ug==} engines: {node: '>= 12.0.0'} hasBin: true peerDependenciesMeta: '@parcel/core': optional: true dependencies: - '@parcel/config-default': 2.9.1(@parcel/core@2.9.1) - '@parcel/core': 2.9.1 - '@parcel/diagnostic': 2.9.1 - '@parcel/events': 2.9.1 - '@parcel/fs': 2.9.1(@parcel/core@2.9.1) - '@parcel/logger': 2.9.1 - '@parcel/package-manager': 2.9.1(@parcel/core@2.9.1) - '@parcel/reporter-cli': 2.9.1(@parcel/core@2.9.1) - '@parcel/reporter-dev-server': 2.9.1(@parcel/core@2.9.1) - '@parcel/reporter-tracer': 2.9.1(@parcel/core@2.9.1) - '@parcel/utils': 2.9.1 + '@parcel/config-default': 2.9.2(@parcel/core@2.9.2) + '@parcel/core': 2.9.2 + '@parcel/diagnostic': 2.9.2 + '@parcel/events': 2.9.2 + '@parcel/fs': 2.9.2(@parcel/core@2.9.2) + '@parcel/logger': 2.9.2 + '@parcel/package-manager': 2.9.2(@parcel/core@2.9.2) + '@parcel/reporter-cli': 2.9.2(@parcel/core@2.9.2) + '@parcel/reporter-dev-server': 2.9.2(@parcel/core@2.9.2) + '@parcel/reporter-tracer': 2.9.2(@parcel/core@2.9.2) + '@parcel/utils': 2.9.2 chalk: 4.1.2 commander: 7.2.0 get-port: 4.2.0 @@ -5023,26 +5185,26 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-router-dom@6.11.2(react-dom@0.0.0-experimental-49f741046-20230305)(react@0.0.0-experimental-49f741046-20230305): - resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==} + /react-router-dom@6.12.1(react-dom@0.0.0-experimental-49f741046-20230305)(react@0.0.0-experimental-49f741046-20230305): + resolution: {integrity: sha512-POIZN9UDKWwEDga054LvYr2KnK8V+0HR4Ny4Bwv8V7/FZCPxJgsCjYxXGxqxzHs7VBxMKZfgvtKhafuJkJSPGA==} engines: {node: '>=14'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.6.2 + '@remix-run/router': 1.6.3 react: 0.0.0-experimental-49f741046-20230305 react-dom: 0.0.0-experimental-49f741046-20230305(react@0.0.0-experimental-49f741046-20230305) - react-router: 6.11.2(react@0.0.0-experimental-49f741046-20230305) + react-router: 6.12.1(react@0.0.0-experimental-49f741046-20230305) dev: false - /react-router@6.11.2(react@0.0.0-experimental-49f741046-20230305): - resolution: {integrity: sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==} + /react-router@6.12.1(react@0.0.0-experimental-49f741046-20230305): + resolution: {integrity: sha512-evd/GrKJOeOypD0JB9e1r7pQh2gWCsTbUfq059Wm1AFT/K2MNZuDo19lFtAgIhlBrp0MmpgpqtvZC7LPAs7vSw==} engines: {node: '>=14'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.6.2 + '@remix-run/router': 1.6.3 react: 0.0.0-experimental-49f741046-20230305 dev: false @@ -5460,7 +5622,7 @@ packages: engines: {node: '>=8'} dev: true - /ts-jest@29.0.5(@babel/core@7.22.1)(jest@29.4.3)(typescript@5.0.4): + /ts-jest@29.0.5(@babel/core@7.22.5)(jest@29.4.3)(typescript@5.0.4): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5481,7 +5643,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.1 + '@babel/core': 7.22.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.4.3(@types/node@18.14.6) @@ -5494,8 +5656,8 @@ packages: yargs-parser: 21.1.1 dev: true - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} dev: true /type-check@0.3.2: @@ -5562,13 +5724,13 @@ packages: picocolors: 1.0.0 dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.7): + /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.7 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -5724,11 +5886,6 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} From 94d5a54cc7646849deba90464620aa73b04d2373 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 13:48:34 -0400 Subject: [PATCH 3/7] Add temporary debug logging --- .../src/examples/demos/streaming-cache/index.tsx | 1 + packages/suspense/src/cache/createCache.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx b/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx index 441ea5f..a07b901 100644 --- a/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx +++ b/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx @@ -21,6 +21,7 @@ export type Metadata = { }; const streamingCache = createStreamingCache<[Post[]], Post[], Metadata>({ + enableDebugLogging: true, load: async ( options: StreamingCacheLoadOptions, posts: Post[] diff --git a/packages/suspense/src/cache/createCache.ts b/packages/suspense/src/cache/createCache.ts index 866612b..7cc4649 100644 --- a/packages/suspense/src/cache/createCache.ts +++ b/packages/suspense/src/cache/createCache.ts @@ -29,6 +29,8 @@ import { isResolvedRecord, } from "../utils/isRecordStatus"; +console.log("[createCache] isDevelopment:", isDevelopment); +console.log("[createCache] NODE_ENV:", process.env.NODE_ENV); export type InternalCache, Value> = Cache< Params, Value From 8d04d3bc4d7ee3f2a78742f4307d649e705c26d8 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 14:27:52 -0400 Subject: [PATCH 4/7] Add dev warnings for object keys to interval and streaming caches --- .../suspense/src/cache/createCache.test.ts | 4 +-- .../createIntervalCache.test.ts | 27 +++++++++++++++++++ .../createIntervalCache.ts | 23 +++++++++++++++- .../src/cache/createStreamingCache.test.ts | 23 ++++++++++++++++ .../src/cache/createStreamingCache.ts | 27 ++++++++++++++++++- 5 files changed, 100 insertions(+), 4 deletions(-) diff --git a/packages/suspense/src/cache/createCache.test.ts b/packages/suspense/src/cache/createCache.test.ts index 3b8f07e..3f246f0 100644 --- a/packages/suspense/src/cache/createCache.test.ts +++ b/packages/suspense/src/cache/createCache.test.ts @@ -741,7 +741,7 @@ describe("createCache", () => { jest.spyOn(console, "warn").mockImplementation(() => {}); - cache.read({}, "one"); + cache.readAsync({}, "one"); expect(console.warn).toHaveBeenCalledTimes(1); expect(console.warn).toHaveBeenCalledWith( @@ -749,7 +749,7 @@ describe("createCache", () => { ); // Only warn once per cache though - cache.read({}, "two"); + cache.readAsync({}, "two"); expect(console.warn).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts index 6a72d48..e865c63 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts @@ -989,4 +989,31 @@ describe("createIntervalCache", () => { expect(cache.getStatus(2, 4, "test")).toBe(STATUS_RESOLVED); }); }); + + describe("development warnings", () => { + it("should warn if a key contains a stringified object", async () => { + const cache = createIntervalCache< + number, + [object: Object, string: string], + boolean + >({ + getKey: (object, string) => `${object}:${string}`, + getPointForValue: () => 1, + load: () => [true], + }); + + jest.spyOn(console, "warn").mockImplementation(() => {}); + + cache.readAsync(0, 10, {}, "one"); + + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.warn).toHaveBeenCalledWith( + expect.stringMatching("contains a stringified object") + ); + + // Only warn once per cache though + cache.readAsync(0, 10, {}, "two"); + expect(console.warn).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts index 7b0cce8..345fc71 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts @@ -1,3 +1,4 @@ +import { isDevelopment } from "#is-development"; import { configure as configureArraySortingUtilities } from "array-sorting-utilities"; import { configure as configureIntervalUtilities, @@ -78,7 +79,7 @@ export function createIntervalCache< ...params: [...Params, IntervalCacheLoadOptions] ) => PromiseLike> | ValuesArray; }): IntervalCache { - const { + let { debugLabel, enableDebugLogging, getKey = defaultGetKey, @@ -86,6 +87,26 @@ export function createIntervalCache< load, } = options; + if (isDevelopment) { + let didLogWarning = false; + let decoratedGetKey = getKey; + + getKey = (...params: Params) => { + const key = decoratedGetKey(...params); + + if (!didLogWarning) { + if (key.includes("[object Object]")) { + didLogWarning = true; + console.warn( + `Warning: createCache() key "${key}" contains a stringified object and may not be unique` + ); + } + } + + return key; + }; + } + const arraySortUtils = configureArraySortingUtilities( (a: Value, b: Value) => comparePoints(getPointForValue(a), getPointForValue(b)) diff --git a/packages/suspense/src/cache/createStreamingCache.test.ts b/packages/suspense/src/cache/createStreamingCache.test.ts index db9fe89..8582d2c 100644 --- a/packages/suspense/src/cache/createStreamingCache.test.ts +++ b/packages/suspense/src/cache/createStreamingCache.test.ts @@ -439,4 +439,27 @@ describe("createStreamingCache", () => { }); }); }); + + describe("development warnings", () => { + it("should warn if a key contains a stringified object", async () => { + const cache = createStreamingCache<[Object, string], boolean, any>({ + debugLabel: "cache", + getKey: (object, id) => `${object}-${id}`, + load: () => true, + }); + + jest.spyOn(console, "warn").mockImplementation(() => {}); + + cache.stream({}, "one"); + + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.warn).toHaveBeenCalledWith( + expect.stringMatching("contains a stringified object") + ); + + // Only warn once per cache though + cache.stream({}, "two"); + expect(console.warn).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/packages/suspense/src/cache/createStreamingCache.ts b/packages/suspense/src/cache/createStreamingCache.ts index 835da04..81cb639 100644 --- a/packages/suspense/src/cache/createStreamingCache.ts +++ b/packages/suspense/src/cache/createStreamingCache.ts @@ -28,13 +28,33 @@ export function createStreamingCache< ...params: Params ) => void; }): StreamingCache { - const { + let { debugLabel, enableDebugLogging, getKey = defaultGetKey, load, } = options; + if (isDevelopment) { + let didLogWarning = false; + let decoratedGetKey = getKey; + + getKey = (...params: Params) => { + const key = decoratedGetKey(...params); + + if (!didLogWarning) { + if (key.includes("[object Object]")) { + didLogWarning = true; + console.warn( + `Warning: createCache() key "${key}" contains a stringified object and may not be unique` + ); + } + } + + return key; + }; + } + const debugLog = (message: string, params?: Params, ...args: any[]) => { const cacheKey = params ? `"${getKey(...params)}"` : ""; const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; @@ -94,6 +114,11 @@ export function createStreamingCache< let cached = streamingValuesMap.get(cacheKey); if (cached == null) { + debugLog( + "getOrCreateStreamingValue(): cache miss. creating streaming value...", + params + ); + const deferred = createDeferred>( debugLabel ? `${debugLabel}: ${cacheKey}` : cacheKey ); From 8d864e650ab3a40f1aa4f58f15e2cc13bb2ea295 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 14:30:25 -0400 Subject: [PATCH 5/7] Update CHANGELOG --- packages/suspense/CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/suspense/CHANGELOG.md b/packages/suspense/CHANGELOG.md index b616523..73d12fc 100644 --- a/packages/suspense/CHANGELOG.md +++ b/packages/suspense/CHANGELOG.md @@ -1,7 +1,11 @@ # Changelog +## 0.0.40 +* Added opt-in debug logging per cache (`enableDebugLogging` config) as well as globally (`enableDebugLogging` export) for development builds. +* Add (DEV-only) warning to `createIntervalCache` and `createStreamingCache` for non-unique cache keys– specifically warning about the key containing an `Object` case as a string. + ## 0.0.39 -* Add (DEV-only) warning for non-unique cache keys– specifically warning about the key containing an `Object` case as a string. +* Add (DEV-only) warning to `createCache` for non-unique cache keys– specifically warning about the key containing an `Object` case as a string. ## 0.0.38 * [32](https://github.com/bvaughn/suspense/pull/32): Build release bundle with Preconstruct From 630509bc828083fd6b8743d79f9ebdfecca1df7a Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 15:38:25 -0400 Subject: [PATCH 6/7] Added more testing for dev mode behavior --- .../examples/demos/streaming-cache/index.tsx | 2 +- .../suspense/src/cache/createCache.test.ts | 68 +++++++-- packages/suspense/src/cache/createCache.ts | 30 ++-- .../createIntervalCache.test.ts | 72 ++++++++-- .../createIntervalCache.ts | 16 ++- .../src/cache/createStreamingCache.test.ts | 134 ++++++++++++++---- .../src/cache/createStreamingCache.ts | 25 ++-- packages/suspense/src/types.ts | 6 + packages/suspense/src/utils/debugging.test.ts | 41 ++++++ packages/suspense/src/utils/debugging.ts | 2 +- 10 files changed, 322 insertions(+), 74 deletions(-) create mode 100644 packages/suspense/src/utils/debugging.test.ts diff --git a/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx b/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx index a07b901..a8e1beb 100644 --- a/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx +++ b/packages/suspense-website/src/examples/demos/streaming-cache/index.tsx @@ -21,7 +21,7 @@ export type Metadata = { }; const streamingCache = createStreamingCache<[Post[]], Post[], Metadata>({ - enableDebugLogging: true, + getKey: (posts) => `${posts.map((post) => post.id).join(":")}`, load: async ( options: StreamingCacheLoadOptions, posts: Post[] diff --git a/packages/suspense/src/cache/createCache.test.ts b/packages/suspense/src/cache/createCache.test.ts index 3f246f0..ce2f218 100644 --- a/packages/suspense/src/cache/createCache.test.ts +++ b/packages/suspense/src/cache/createCache.test.ts @@ -26,8 +26,8 @@ function defaultLoad( describe("createCache", () => { let cache: Cache<[string], string>; - let load: jest.Mock | string, [[string], CacheLoadOptions]>; let getCacheKey: jest.Mock; + let load: jest.Mock | string, [[string], CacheLoadOptions]>; beforeEach(() => { load = jest.fn(); @@ -43,6 +43,10 @@ describe("createCache", () => { }); }); + afterEach(() => { + jest.restoreAllMocks(); + }); + async function fakeSuspend(read: () => any) { try { return read(); @@ -732,16 +736,13 @@ describe("createCache", () => { }); }); - describe("development warnings", () => { + describe("development mode", () => { it("should warn if a key contains a stringified object", async () => { - const cache = createCache<[Object, string], boolean>({ - getKey: ([object, id]) => `${object}-${id}`, - load: ([object, id]) => true, - }); - jest.spyOn(console, "warn").mockImplementation(() => {}); - cache.readAsync({}, "one"); + getCacheKey.mockImplementation((string) => `${{ string }}`); + + cache.readAsync("one"); expect(console.warn).toHaveBeenCalledTimes(1); expect(console.warn).toHaveBeenCalledWith( @@ -749,8 +750,57 @@ describe("createCache", () => { ); // Only warn once per cache though - cache.readAsync({}, "two"); + cache.readAsync("two"); expect(console.warn).toHaveBeenCalledTimes(1); }); + + it("logs debug messages to console", () => { + const consoleMock = jest + .spyOn(console, "log") + .mockImplementation(() => {}); + + cache = createCache<[string], string>({ + debugLabel: "test-cache", + debugLogging: true, + getKey: getCacheKey, + load, + }); + console.log(consoleMock.mock.calls); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("Creating cache"), + ]) + ); + + consoleMock.mockClear(); + cache.readAsync("one"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("readAsync"), + expect.stringContaining("one"), + ]) + ); + + consoleMock.mockClear(); + cache.disableDebugLogging(); + cache.readAsync("two"); + expect(consoleMock).not.toHaveBeenCalled(); + + consoleMock.mockClear(); + cache.enableDebugLogging(); + cache.readAsync("three"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("readAsync"), + expect.stringContaining("three"), + ]) + ); + }); }); }); diff --git a/packages/suspense/src/cache/createCache.ts b/packages/suspense/src/cache/createCache.ts index 7cc4649..e53de70 100644 --- a/packages/suspense/src/cache/createCache.ts +++ b/packages/suspense/src/cache/createCache.ts @@ -29,8 +29,6 @@ import { isResolvedRecord, } from "../utils/isRecordStatus"; -console.log("[createCache] isDevelopment:", isDevelopment); -console.log("[createCache] NODE_ENV:", process.env.NODE_ENV); export type InternalCache, Value> = Cache< Params, Value @@ -52,7 +50,7 @@ export type CreateCacheOptions, Value> = { immutable?: boolean; }; debugLabel?: string; - enableDebugLogging?: boolean; + debugLogging?: boolean; getKey?: (params: Params) => string; load: ( params: Params, @@ -66,7 +64,7 @@ export function createCache, Value>( let { config = {}, debugLabel, - enableDebugLogging, + debugLogging, getKey = defaultGetKey, load, } = options; @@ -96,7 +94,7 @@ export function createCache, Value>( const cacheKey = params ? `"${getKey(params)}"` : ""; const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; - log(enableDebugLogging, [ + log(debugLogging, [ `%c${prefix}`, "font-weight: bold; color: yellow;", message, @@ -211,6 +209,14 @@ export function createCache, Value>( }); } + function disableDebugLogging() { + debugLogging = false; + } + + function enableDebugLogging() { + debugLogging = true; + } + function evict(...params: Params): boolean { const cacheKey = getKey(params); const pendingMutationRecordMap = getCacheForType( @@ -262,10 +268,7 @@ export function createCache, Value>( let record = getRecord(...params); if (record == null) { - debugLog( - "getOrCreateRecord(): record not found. creating record...", - params - ); + debugLog("getOrCreateRecord(): Cache miss. Creating record...", params); const abortController = new AbortController(); const deferred = createDeferred( debugLabel ? `${debugLabel} ${cacheKey}` : cacheKey @@ -279,8 +282,9 @@ export function createCache, Value>( processPendingRecord(abortController.signal, record, ...params); } + debugLog( - "getOrCreateRecord(): record found. returning record", + "getOrCreateRecord(): Cache hit. Returning record", params, record ); @@ -357,6 +361,8 @@ export function createCache, Value>( } function readAsync(...params: Params): PromiseLike | Value { + debugLog(`readAsync()`, params); + const record = getOrCreateRecord(...params); if (isPendingRecord(record)) { return record.data.deferred.promise; @@ -368,6 +374,8 @@ export function createCache, Value>( } function read(...params: Params): Value { + debugLog(`read()`, params); + const record = getOrCreateRecord(...params); if (isPendingRecord(record)) { throw record.data.deferred.promise; @@ -469,6 +477,8 @@ export function createCache, Value>( // Public API abort, cache, + disableDebugLogging, + enableDebugLogging, evict, evictAll, getStatus, diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts index e865c63..f036da2 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts @@ -42,6 +42,7 @@ function getPointForValue(value: number) { describe("createIntervalCache", () => { let cache: IntervalCache; + let getCacheKey: jest.Mock; let load: jest.Mock< PromiseLike | PartialArray>, [ @@ -53,12 +54,16 @@ describe("createIntervalCache", () => { >; beforeEach(() => { + getCacheKey = jest.fn(); + getCacheKey.mockImplementation((key) => key); + load = jest.fn(); load.mockImplementation(async (start: number, end: number, id: string) => createContiguousArray(start, end) ); cache = createIntervalCache({ + getKey: getCacheKey, getPointForValue, load, }); @@ -990,21 +995,13 @@ describe("createIntervalCache", () => { }); }); - describe("development warnings", () => { + describe("development mode", () => { it("should warn if a key contains a stringified object", async () => { - const cache = createIntervalCache< - number, - [object: Object, string: string], - boolean - >({ - getKey: (object, string) => `${object}:${string}`, - getPointForValue: () => 1, - load: () => [true], - }); - jest.spyOn(console, "warn").mockImplementation(() => {}); - cache.readAsync(0, 10, {}, "one"); + getCacheKey.mockImplementation((string) => `${{ string }}`); + + cache.readAsync(0, 10, "one"); expect(console.warn).toHaveBeenCalledTimes(1); expect(console.warn).toHaveBeenCalledWith( @@ -1012,8 +1009,57 @@ describe("createIntervalCache", () => { ); // Only warn once per cache though - cache.readAsync(0, 10, {}, "two"); + cache.readAsync(0, 10, "two"); expect(console.warn).toHaveBeenCalledTimes(1); }); + + it("logs debug messages to console", () => { + const consoleMock = jest + .spyOn(console, "log") + .mockImplementation(() => {}); + + cache = createIntervalCache({ + debugLabel: "test-cache", + debugLogging: true, + getPointForValue, + load, + }); + console.log(consoleMock.mock.calls); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("Creating cache"), + ]) + ); + + consoleMock.mockClear(); + cache.readAsync(0, 10, "one"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("readAsync"), + expect.stringContaining("one"), + ]) + ); + + consoleMock.mockClear(); + cache.disableDebugLogging(); + cache.readAsync(0, 10, "two"); + expect(consoleMock).not.toHaveBeenCalled(); + + consoleMock.mockClear(); + cache.enableDebugLogging(); + cache.readAsync(0, 10, "three"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("readAsync"), + expect.stringContaining("three"), + ]) + ); + }); }); }); diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts index 345fc71..7d8d755 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts @@ -70,7 +70,7 @@ export function createIntervalCache< Value >(options: { debugLabel?: string; - enableDebugLogging?: boolean; + debugLogging?: boolean; getKey?: (...params: Params) => string; getPointForValue: GetPointForValue; load: ( @@ -81,7 +81,7 @@ export function createIntervalCache< }): IntervalCache { let { debugLabel, - enableDebugLogging, + debugLogging, getKey = defaultGetKey, getPointForValue, load, @@ -130,7 +130,7 @@ export function createIntervalCache< ? `createIntervalCache[${debugLabel}]` : "createIntervalCache"; - log(enableDebugLogging, [ + log(debugLogging, [ `%c${prefix}`, "font-weight: bold; color: yellow;", message, @@ -206,6 +206,14 @@ export function createIntervalCache< return `${start}–${end}`; } + function disableDebugLogging() { + debugLogging = false; + } + + function enableDebugLogging() { + debugLogging = true; + } + function evict(...params: Params): boolean { debugLog("evict()", params); @@ -762,6 +770,8 @@ export function createIntervalCache< return { abort, + disableDebugLogging, + enableDebugLogging, evict, evictAll, getStatus, diff --git a/packages/suspense/src/cache/createStreamingCache.test.ts b/packages/suspense/src/cache/createStreamingCache.test.ts index 8582d2c..d5a2e65 100644 --- a/packages/suspense/src/cache/createStreamingCache.test.ts +++ b/packages/suspense/src/cache/createStreamingCache.test.ts @@ -4,13 +4,17 @@ import { STATUS_REJECTED, STATUS_RESOLVED, } from "../constants"; -import { createStreamingCache } from "./createStreamingCache"; import { StreamingCache, StreamingCacheLoadOptions } from "../types"; +import { createStreamingCache } from "./createStreamingCache"; describe("createStreamingCache", () => { type Metadata = { length: number }; type Value = string; + afterEach(() => { + jest.restoreAllMocks(); + }); + describe("single value (string)", () => { let cache: StreamingCache<[string], Value, Metadata>; let fetch: jest.Mock< @@ -332,30 +336,11 @@ describe("createStreamingCache", () => { expect(streaming.status).toBe(STATUS_REJECTED); }); - it("warns about invalid progress values", () => { - jest.spyOn(console, "warn").mockImplementation(() => {}); - - cache.stream("string"); - - const options = optionsMap.get("string")!; - options.update([], -1); - expect(console.warn).toHaveBeenCalledTimes(1); - expect(console.warn).toHaveBeenCalledWith( - "Invalid progress: -1; value must be between 0-1." - ); - - options.update([], 2); - expect(console.warn).toHaveBeenCalledTimes(2); - expect(console.warn).toHaveBeenCalledWith( - "Invalid progress: 2; value must be between 0-1." - ); - }); - it("caches values so they are only streamed once", () => { cache.stream("string"); const options = optionsMap.get("string")!; - options.update([1, 2], -1); + options.update([1, 2], 1); options.resolve(); expect(fetch).toHaveBeenCalledTimes(1); @@ -440,17 +425,43 @@ describe("createStreamingCache", () => { }); }); - describe("development warnings", () => { - it("should warn if a key contains a stringified object", async () => { - const cache = createStreamingCache<[Object, string], boolean, any>({ + describe("development mode", () => { + type Value = number[]; + + let cache: StreamingCache<[string], Value>; + let fetch: jest.Mock< + void, + [options: StreamingCacheLoadOptions, key: string] + >; + let getKey: jest.Mock; + let optionsMap: Map>; + + beforeEach(() => { + optionsMap = new Map(); + + getKey = jest.fn(); + getKey.mockImplementation((string) => string); + + fetch = jest.fn(); + fetch.mockImplementation( + (options: StreamingCacheLoadOptions, key: string) => { + optionsMap.set(key, options); + } + ); + + cache = createStreamingCache<[string], Value, any>({ debugLabel: "cache", - getKey: (object, id) => `${object}-${id}`, - load: () => true, + getKey, + load: fetch, }); + }); + it("should warn if a key contains a stringified object", async () => { jest.spyOn(console, "warn").mockImplementation(() => {}); - cache.stream({}, "one"); + getKey.mockImplementation((string) => `${{ string }}`); + + cache.stream("one"); expect(console.warn).toHaveBeenCalledTimes(1); expect(console.warn).toHaveBeenCalledWith( @@ -458,8 +469,75 @@ describe("createStreamingCache", () => { ); // Only warn once per cache though - cache.stream({}, "two"); + cache.stream("two"); expect(console.warn).toHaveBeenCalledTimes(1); }); + + it("warns about invalid progress values", () => { + jest.spyOn(console, "warn").mockImplementation(() => {}); + + cache.stream("string"); + + const options = optionsMap.get("string")!; + options.update([], -1); + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.warn).toHaveBeenCalledWith( + "Invalid progress: -1; value must be between 0-1." + ); + + options.update([], 2); + expect(console.warn).toHaveBeenCalledTimes(2); + expect(console.warn).toHaveBeenCalledWith( + "Invalid progress: 2; value must be between 0-1." + ); + }); + + it("logs debug messages to console", () => { + const consoleMock = jest + .spyOn(console, "log") + .mockImplementation(() => {}); + + cache = createStreamingCache<[string], Value, any>({ + debugLabel: "test-cache", + debugLogging: true, + getKey, + load: fetch, + }); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("Creating cache"), + ]) + ); + + consoleMock.mockClear(); + cache.stream("one"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("stream"), + expect.stringContaining("one"), + ]) + ); + + consoleMock.mockClear(); + cache.disableDebugLogging(); + cache.stream("two"); + expect(consoleMock).not.toHaveBeenCalled(); + + consoleMock.mockClear(); + cache.enableDebugLogging(); + cache.stream("three"); + expect(consoleMock).toHaveBeenCalled(); + expect(consoleMock.mock.calls[0]).toEqual( + expect.arrayContaining([ + expect.stringContaining("test-cache"), + expect.stringContaining("stream"), + expect.stringContaining("three"), + ]) + ); + }); }); }); diff --git a/packages/suspense/src/cache/createStreamingCache.ts b/packages/suspense/src/cache/createStreamingCache.ts index 81cb639..db51085 100644 --- a/packages/suspense/src/cache/createStreamingCache.ts +++ b/packages/suspense/src/cache/createStreamingCache.ts @@ -21,19 +21,14 @@ export function createStreamingCache< AdditionalData = undefined >(options: { debugLabel?: string; - enableDebugLogging?: boolean; + debugLogging?: boolean; getKey?: (...params: Params) => string; load: ( options: StreamingCacheLoadOptions, ...params: Params ) => void; }): StreamingCache { - let { - debugLabel, - enableDebugLogging, - getKey = defaultGetKey, - load, - } = options; + let { debugLabel, debugLogging, getKey = defaultGetKey, load } = options; if (isDevelopment) { let didLogWarning = false; @@ -59,7 +54,7 @@ export function createStreamingCache< const cacheKey = params ? `"${getKey(...params)}"` : ""; const prefix = debugLabel ? `createCache[${debugLabel}]` : "createCache"; - log(enableDebugLogging, [ + log(debugLogging, [ `%c${prefix}`, "font-weight: bold; color: yellow;", message, @@ -89,6 +84,14 @@ export function createStreamingCache< return false; } + function disableDebugLogging() { + debugLogging = false; + } + + function enableDebugLogging() { + debugLogging = true; + } + function evict(...params: Params) { debugLog("evict()", params); @@ -115,7 +118,7 @@ export function createStreamingCache< let cached = streamingValuesMap.get(cacheKey); if (cached == null) { debugLog( - "getOrCreateStreamingValue(): cache miss. creating streaming value...", + "getOrCreateStreamingValue(): Cache miss. Creating streaming value...", params ); @@ -236,6 +239,8 @@ export function createStreamingCache< } function stream(...params: Params) { + debugLog(`stream()`, params); + return getOrCreateStreamingValue(...params); } @@ -258,6 +263,8 @@ export function createStreamingCache< return { abort, + disableDebugLogging, + enableDebugLogging, evict, evictAll, prefetch, diff --git a/packages/suspense/src/types.ts b/packages/suspense/src/types.ts index 0ac7c80..702a5d3 100644 --- a/packages/suspense/src/types.ts +++ b/packages/suspense/src/types.ts @@ -72,6 +72,8 @@ export interface Deferred { export interface Cache { abort(...params: Params): boolean; cache(value: Value, ...params: Params): void; + disableDebugLogging(): void; + enableDebugLogging(): void; evict(...params: Params): boolean; evictAll(): void; getStatus(...params: Params): Status; @@ -94,6 +96,8 @@ export type CacheLoadOptions = { export type IntervalCache = { abort(...params: Params): boolean; + disableDebugLogging(): void; + enableDebugLogging(): void; evict(...params: Params): boolean; evictAll(): boolean; getStatus(start: Point, end: Point, ...params: Params): Status; @@ -152,6 +156,8 @@ export interface StreamingCache< AdditionalData = undefined > { abort(...params: Params): boolean; + disableDebugLogging(): void; + enableDebugLogging(): void; evict(...params: Params): boolean; evictAll(): boolean; prefetch(...params: Params): void; diff --git a/packages/suspense/src/utils/debugging.test.ts b/packages/suspense/src/utils/debugging.test.ts new file mode 100644 index 0000000..3cbb13a --- /dev/null +++ b/packages/suspense/src/utils/debugging.test.ts @@ -0,0 +1,41 @@ +import { disableDebugLogging, enableDebugLogging, log } from "./debugging"; + +describe("debugging", () => { + let consoleMock: jest.SpyInstance< + void, + [message?: any, ...optionalParams: any[]], + any + >; + + beforeEach(() => { + consoleMock = jest.spyOn(console, "log").mockImplementation(() => {}); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it("should honor the debug param", () => { + log(true, ["should be logged"]); + expect(consoleMock).toHaveBeenCalledTimes(1); + expect(consoleMock).toHaveBeenCalledWith("should be logged"); + + log(false, ["should not be logged"]); + expect(consoleMock).toHaveBeenCalledTimes(1); + + enableDebugLogging(); + log(false, ["should not be logged"]); + expect(consoleMock).toHaveBeenCalledTimes(1); + }); + + it("should default to using the global the debug value if no debug param passed", () => { + enableDebugLogging(); + log(undefined, ["should be logged"]); + expect(consoleMock).toHaveBeenCalledTimes(1); + expect(consoleMock).toHaveBeenCalledWith("should be logged"); + + disableDebugLogging(); + log(undefined, ["should not be logged"]); + expect(consoleMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/suspense/src/utils/debugging.ts b/packages/suspense/src/utils/debugging.ts index 850b06c..7d74faf 100644 --- a/packages/suspense/src/utils/debugging.ts +++ b/packages/suspense/src/utils/debugging.ts @@ -10,7 +10,7 @@ export function enableDebugLogging(): void { enabled = true; } -export function log(enableDebugLogging = enabled, args: string[]) { +export function log(enableDebugLogging = enabled, args: any[]) { if (isDevelopment) { if (enableDebugLogging) { console.log(...args); From 6707744c71f5089ac8bc42344462b8e9e8a2ed1a Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sat, 24 Jun 2023 16:07:12 -0400 Subject: [PATCH 7/7] Tightened up debug logging messages for consistency --- .../suspense/src/cache/createCache.test.ts | 6 +-- packages/suspense/src/cache/createCache.ts | 54 ++++++++----------- .../createIntervalCache.test.ts | 6 +-- .../createIntervalCache.ts | 47 ++++++++-------- .../src/cache/createStreamingCache.test.ts | 2 +- .../src/cache/createStreamingCache.ts | 22 ++++---- 6 files changed, 65 insertions(+), 72 deletions(-) diff --git a/packages/suspense/src/cache/createCache.test.ts b/packages/suspense/src/cache/createCache.test.ts index ce2f218..029ab23 100644 --- a/packages/suspense/src/cache/createCache.test.ts +++ b/packages/suspense/src/cache/createCache.test.ts @@ -770,7 +770,7 @@ describe("createCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("Creating cache"), + expect.stringContaining("Cache created"), ]) ); @@ -780,7 +780,7 @@ describe("createCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("readAsync"), + expect.stringContaining("read"), expect.stringContaining("one"), ]) ); @@ -797,7 +797,7 @@ describe("createCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("readAsync"), + expect.stringContaining("read"), expect.stringContaining("three"), ]) ); diff --git a/packages/suspense/src/cache/createCache.ts b/packages/suspense/src/cache/createCache.ts index e53de70..48c640e 100644 --- a/packages/suspense/src/cache/createCache.ts +++ b/packages/suspense/src/cache/createCache.ts @@ -103,7 +103,7 @@ export function createCache, Value>( ]); }; - debugLog("Creating cache ..."); + debugLog("Cache created"); // This map enables selective mutations to be scheduled with React // (one record can be invalidated without affecting others) @@ -168,6 +168,8 @@ export function createCache, Value>( } function cache(value: Value, ...params: Params): void { + debugLog("cache()", params); + const cacheKey = getKey(params); const pendingMutationRecordMap = getCacheForType( createPendingMutationRecordMap @@ -176,8 +178,6 @@ export function createCache, Value>( let record: Record | undefined = getRecord(...params); if (record != null) { if (isPendingRecord(record)) { - debugLog("cache()", params, "Update pending record to:", value); - const { abortController, deferred } = record.data; abortController.abort(); @@ -191,8 +191,6 @@ export function createCache, Value>( } } - debugLog("cache()", params, "Create new resolved record with:", value); - record = createResolvedRecord(value); recordMap.set(cacheKey, record); @@ -200,12 +198,10 @@ export function createCache, Value>( } function createPendingMutationRecordMap(): CacheMap> { - return getCache((key) => { + return getCache(() => { // We don't really need to do anything here // This map will almost always be a subset of the recordMap // but we also don't want it to bypass the getCache() eviction logic (if any) - // Leave a debug log here in case we need to revisit this - debugLog(`getCache() ${key}`); }); } @@ -223,7 +219,7 @@ export function createCache, Value>( createPendingMutationRecordMap ); - debugLog(`evict()`, params); + debugLog("evict()", params); const didDelete = recordMap.delete(cacheKey); pendingMutationRecordMap.delete(cacheKey); @@ -238,7 +234,7 @@ export function createCache, Value>( createPendingMutationRecordMap ); - debugLog(`evictAll()`, undefined); + debugLog("evictAll()", undefined); recordMap.clear(); pendingMutationRecordMap.clear(); @@ -268,7 +264,8 @@ export function createCache, Value>( let record = getRecord(...params); if (record == null) { - debugLog("getOrCreateRecord(): Cache miss. Creating record...", params); + debugLog("read() Cache miss", params); + const abortController = new AbortController(); const deferred = createDeferred( debugLabel ? `${debugLabel} ${cacheKey}` : cacheKey @@ -281,18 +278,16 @@ export function createCache, Value>( notifySubscribers(params); processPendingRecord(abortController.signal, record, ...params); + } else { + debugLog("read() Cache hit", params); } - debugLog( - "getOrCreateRecord(): Cache hit. Returning record", - params, - record - ); - return record; } function getStatus(...params: Params): Status { + debugLog("getStatus()", params); + const cacheKey = getKey(params); // Check for pending mutations first @@ -313,6 +308,8 @@ export function createCache, Value>( } function getValue(...params: Params): Value { + debugLog("getValue()", params); + const cacheKey = getKey(params); const record = recordMap.get(cacheKey); @@ -328,6 +325,8 @@ export function createCache, Value>( } function getValueIfCached(...params: Params): Value | undefined { + debugLog("getValueIfCached()", params); + const cacheKey = getKey(params); const record = recordMap.get(cacheKey); if (record && isResolvedRecord(record)) { @@ -336,8 +335,6 @@ export function createCache, Value>( } function onExternalCacheEviction(key: string): void { - debugLog(`onExternalCacheEviction(${key})`); - const set = subscriberMap.get(key); if (set) { set.forEach((callback) => { @@ -347,7 +344,7 @@ export function createCache, Value>( } function prefetch(...params: Params): void { - debugLog(`prefetch()`, params); + debugLog("prefetch()", params); const promiseOrValue = readAsync(...params); if (isPromiseLike(promiseOrValue)) { @@ -361,8 +358,7 @@ export function createCache, Value>( } function readAsync(...params: Params): PromiseLike | Value { - debugLog(`readAsync()`, params); - + // getOrCreateRecord() will call debugLog (cache hit or miss) const record = getOrCreateRecord(...params); if (isPendingRecord(record)) { return record.data.deferred.promise; @@ -374,8 +370,7 @@ export function createCache, Value>( } function read(...params: Params): Value { - debugLog(`read()`, params); - + // getOrCreateRecord() will call debugLog (cache hit or miss) const record = getOrCreateRecord(...params); if (isPendingRecord(record)) { throw record.data.deferred.promise; @@ -413,19 +408,14 @@ export function createCache, Value>( : valueOrPromiseLike; if (!abortSignal.aborted) { - debugLog( - "processPendingRecord(): resolved", - params, - "resolved value: ", - value - ); + debugLog("read() Pending request resolved", params, value); updateRecordToResolved(record, value); deferred.resolve(value); } } catch (error) { if (!abortSignal.aborted) { - debugLog("processPendingRecord(): rejected", params, error); + debugLog("read() Pending request rejected", params, error); updateRecordToRejected(record, error); deferred.reject(error); @@ -441,6 +431,8 @@ export function createCache, Value>( callback: StatusCallback, ...params: Params ): UnsubscribeCallback { + debugLog("subscribeToStatus()", params); + const cacheKey = getKey(params); let set = subscriberMap.get(cacheKey); if (set) { diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts index f036da2..5086e3d 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.test.ts @@ -1029,7 +1029,7 @@ describe("createIntervalCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("Creating cache"), + expect.stringContaining("Cache created"), ]) ); @@ -1039,7 +1039,7 @@ describe("createIntervalCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("readAsync"), + expect.stringContaining("read"), expect.stringContaining("one"), ]) ); @@ -1056,7 +1056,7 @@ describe("createIntervalCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("readAsync"), + expect.stringContaining("read"), expect.stringContaining("three"), ]) ); diff --git a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts index 7d8d755..6ae019b 100644 --- a/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts +++ b/packages/suspense/src/cache/createIntervalCache/createIntervalCache.ts @@ -139,9 +139,11 @@ export function createIntervalCache< ]); }; - debugLog("Creating cache ..."); + debugLog("Cache created"); function abort(...params: Params): boolean { + debugLog("abort()", params); + const metadataMapKey = getKey(...params); let caught; @@ -150,8 +152,6 @@ export function createIntervalCache< if (metadata) { const { pendingMetadata } = metadata; if (pendingMetadata.length > 0) { - debugLog("abort()", params); - const cloned = [...pendingMetadata]; pendingMetadata.splice(0); @@ -231,7 +231,7 @@ export function createIntervalCache< } function evictAll(): boolean { - debugLog(`evictAll()`, undefined, `${metadataMap.size} records`); + debugLog("evictAll()"); const hadValues = metadataMap.size > 0; @@ -278,6 +278,8 @@ export function createIntervalCache< let record = metadata.recordMap.get(cacheKey); if (record == null) { + debugLog(`read(${start}, ${end}) Cache miss`, params); + const abortController = new AbortController(); const deferred = createDeferred( debugLabel ? `${debugLabel}: ${cacheKey}` : `${cacheKey}` @@ -302,12 +304,16 @@ export function createIntervalCache< end, ...params ); + } else { + debugLog(`read(${start}, ${end}) Cache hit`, params); } return record; } function getStatus(start: Point, end: Point, ...params: Params) { + debugLog(`getStatus(${start}, ${end})`, params); + const metadata = getOrCreateIntervalMetadata(...params); const cacheKey = createCacheKey(start, end); @@ -553,15 +559,6 @@ export function createIntervalCache< intervalUtils ); - debugLog( - `processPendingRecord(${start}, ${end})`, - params, - "\n-> metadata:", - metadata, - "\n-> found:", - foundIntervals - ); - // If any of the unloaded intervals contain a failed request, // we shouldn't try loading them again // This is admittedly somewhat arbitrary but matches Replay's functionality @@ -573,7 +570,7 @@ export function createIntervalCache< ); if (previouslyFailedInterval != null) { const error = Error( - `Cannot load interval that contains previously failed interval` + "Cannot load interval that contains previously failed interval" ); record.data = { error, @@ -633,12 +630,6 @@ export function createIntervalCache< ...pendingPromiseLikes, ]); - debugLog( - `processPendingRecord(${start}, ${end}): resolved`, - params, - values - ); - if (!signal.aborted) { let value = sliceValues( metadata.sortedValues, @@ -660,6 +651,12 @@ export function createIntervalCache< value, }; + debugLog( + `read() Pending request resolved (${start}, ${end})`, + params, + values + ); + deferred.resolve(value); notifySubscribers(start, end, ...params); @@ -673,7 +670,7 @@ export function createIntervalCache< } debugLog( - `processPendingRecord(${start}, ${end}): failed`, + `read() Pending request rejected (${start}, ${end})`, params, errorMessage ); @@ -692,8 +689,7 @@ export function createIntervalCache< } function read(start: Point, end: Point, ...params: Params): Value[] { - debugLog(`read(${start}, ${end})`, params); - + // getOrCreateRecord() will call debugLog (cache hit or miss) const record = getOrCreateRecord(start, end, ...params); if (record.data.status === STATUS_RESOLVED) { return record.data.value as Value[]; @@ -709,8 +705,7 @@ export function createIntervalCache< end: Point, ...params: Params ): PromiseLike | Value[] { - debugLog(`readAsync(${start}, ${end})`, params); - + // getOrCreateRecord() will call debugLog (cache hit or miss) const record = getOrCreateRecord(start, end, ...params); switch (record.data.status) { case STATUS_PENDING: @@ -728,6 +723,8 @@ export function createIntervalCache< end: Point, ...params: Params ) { + debugLog(`subscribeToStatus(${start}, ${end})`, params); + const cacheKey = getKey(...params); let tree = subscriberMap.get(cacheKey); diff --git a/packages/suspense/src/cache/createStreamingCache.test.ts b/packages/suspense/src/cache/createStreamingCache.test.ts index d5a2e65..ddae588 100644 --- a/packages/suspense/src/cache/createStreamingCache.test.ts +++ b/packages/suspense/src/cache/createStreamingCache.test.ts @@ -507,7 +507,7 @@ describe("createStreamingCache", () => { expect(consoleMock.mock.calls[0]).toEqual( expect.arrayContaining([ expect.stringContaining("test-cache"), - expect.stringContaining("Creating cache"), + expect.stringContaining("Cache created"), ]) ); diff --git a/packages/suspense/src/cache/createStreamingCache.ts b/packages/suspense/src/cache/createStreamingCache.ts index db51085..88c5ab1 100644 --- a/packages/suspense/src/cache/createStreamingCache.ts +++ b/packages/suspense/src/cache/createStreamingCache.ts @@ -63,7 +63,7 @@ export function createStreamingCache< ]); }; - debugLog("Creating cache ..."); + debugLog("Cache created"); const abortControllerMap = new Map(); const streamingValuesMap = new Map< @@ -101,7 +101,7 @@ export function createStreamingCache< } function evictAll(): boolean { - debugLog(`evictAll()`, undefined, `${streamingValuesMap.size} records`); + debugLog("evictAll()"); const hadValues = streamingValuesMap.size > 0; @@ -117,10 +117,7 @@ export function createStreamingCache< let cached = streamingValuesMap.get(cacheKey); if (cached == null) { - debugLog( - "getOrCreateStreamingValue(): Cache miss. Creating streaming value...", - params - ); + debugLog("stream() Cache miss", params); const deferred = createDeferred>( debugLabel ? `${debugLabel}: ${cacheKey}` : cacheKey @@ -165,6 +162,8 @@ export function createStreamingCache< return false; } + debugLog(`stream() Pending request aborted`, params); + streamingValues.status = STATUS_ABORTED; streamingValuesMap.delete(cacheKey); @@ -199,6 +198,8 @@ export function createStreamingCache< notifySubscribers(); }, resolve: () => { + debugLog(`stream() Pending request resolved`, params); + assertPending(); streamingValues.complete = true; @@ -210,6 +211,8 @@ export function createStreamingCache< deferred.resolve(streamingValues); }, reject: (error: Error) => { + debugLog(`stream() Pending request rejected`, params); + assertPending(); streamingValues.complete = true; @@ -229,18 +232,19 @@ export function createStreamingCache< return streamingValues; } + debugLog("stream() Cache hit", params); + return cached; } function prefetch(...params: Params): void { - debugLog(`prefetch()`, params); + debugLog("prefetch()", params); getOrCreateStreamingValue(...params); } function stream(...params: Params) { - debugLog(`stream()`, params); - + // getOrCreateStreamingValue() will call debugLog (cache hit or miss) return getOrCreateStreamingValue(...params); }