From 8f1660d068655686670c0670a81f558bd61cd937 Mon Sep 17 00:00:00 2001 From: RobPruzan Date: Thu, 12 Dec 2024 00:41:46 -0500 Subject: [PATCH 1/4] fix(scan): never read promsies in prop viewer --- packages/scan/src/core/web/inspect-element/view-state.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/scan/src/core/web/inspect-element/view-state.ts b/packages/scan/src/core/web/inspect-element/view-state.ts index 4f77bfa0..14beac1d 100644 --- a/packages/scan/src/core/web/inspect-element/view-state.ts +++ b/packages/scan/src/core/web/inspect-element/view-state.ts @@ -737,6 +737,9 @@ export const getValuePreview = (value: any) => { case 'boolean': return value.toString(); case 'object': { + if (value instanceof Promise) { + return 'Promise'; + } const keys = Object.keys(value); if (keys.length <= 3) { return `{${keys.join(', ')}}`; From b5d205cd7c94c3a75c616eca054a74da33754288 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Thu, 12 Dec 2024 00:46:30 -0800 Subject: [PATCH 2/4] refactor(scan): Move LICENSE and update banner in tsup.config.ts --- packages/scan/LICENSE => LICENSE | 0 packages/scan/tsup.config.ts | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+) rename packages/scan/LICENSE => LICENSE (100%) diff --git a/packages/scan/LICENSE b/LICENSE similarity index 100% rename from packages/scan/LICENSE rename to LICENSE diff --git a/packages/scan/tsup.config.ts b/packages/scan/tsup.config.ts index 639fd811..69a1d807 100644 --- a/packages/scan/tsup.config.ts +++ b/packages/scan/tsup.config.ts @@ -27,10 +27,32 @@ const addDirectivesToChunkFiles = async (readPath: string): Promise => { } }; +const banner = `/** + * Copyright 2024 Aiden Bai, Million Software, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the “Software”), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */`; + export default defineConfig([ { entry: ['./src/auto.ts'], outDir: DIST_PATH, + banner: { + js: banner, + }, splitting: false, clean: false, sourcemap: false, @@ -65,6 +87,9 @@ export default defineConfig([ './src/core/monitor/params/remix.ts', './src/core/monitor/params/astro/component.ts', ], + banner: { + js: banner, + }, outDir: DIST_PATH, splitting: false, clean: true, From b40def9c90dff176d8b83fee5f24e497706a2a68 Mon Sep 17 00:00:00 2001 From: Nisarg Patel Date: Thu, 12 Dec 2024 00:48:05 -0800 Subject: [PATCH 3/4] fix: SDK irregularities and commits / branch addition (#106) * fix: added commit and branch props * fix: esbuild issue * feat: pkg-pr-new * refactor(monitor): update Monitoring component - Removed unused imports and variables - Reorganized code for better readability - Added optional parameters for path, params, commit, and branch in Monitoring component - Updated getSession function to accept optional commit and branch parameters - Updated flush function to pass commit and branch to getSession - Updated toPayloadInteraction function to include commit and branch in interaction payload - Updated initPerformanceMonitoring function to include commit and branch in performance entry - Updated Session interface to include url, route, commit, and branch properties - Updated Interaction interface to include commit and branch properties - Updated InternalInteraction interface to include commit and branch properties - Updated AstroMonitor component to use path instead of pathname prop - Updated AstroMonitor component to pass path and params to computeRoute function - Updated MonitoringWithoutRouteProps interface to include optional commit and branch properties * fix: issue with route and path * fix: typo for astro * fix: interactions now send array of paths * refactor(network): improve interaction handling and type definitions - Updated the `getInteractionId` function to clarify path replacement behavior. - Refactored `splitInteractions` to use a for-loop instead of forEach for better performance. - Changed the initialization of `pendingInteractions` and `completedInteractions` to use `new Array()`. - Enhanced type definitions by adding `Component` to imports from './types'. - Improved code readability and organization. * chore: update build scripts and enhance file handling - Added a warning message to the build scripts in both root and scan package to remind developers to bump the version before building. - Refactored file handling in `tsup.config.ts` to use `fs/promises` for asynchronous file operations. - Enhanced the `flush` function in the network monitoring module to improve interaction handling and ensure proper session management. - Updated type definitions for `Interaction` and `Component` to allow for numeric interaction IDs. - Modified the `getSession` function to include the package version in the session data. * fix: better description --- .github/workflows/pkg-pr-new.yaml | 44 ++ package.json | 2 +- packages/scan/package.json | 3 +- packages/scan/src/core/index.ts | 9 +- packages/scan/src/core/monitor/index.ts | 56 ++- packages/scan/src/core/monitor/network.ts | 143 +++--- .../monitor/params/astro/Monitoring.astro | 4 +- .../core/monitor/params/astro/component.ts | 8 +- packages/scan/src/core/monitor/params/next.ts | 6 +- .../core/monitor/params/react-router-v5.ts | 4 +- .../core/monitor/params/react-router-v6.ts | 4 +- .../scan/src/core/monitor/params/remix.ts | 4 +- packages/scan/src/core/monitor/performance.ts | 14 +- packages/scan/src/core/monitor/types.ts | 22 +- packages/scan/src/core/monitor/utils.ts | 12 +- packages/scan/tsup.config.ts | 14 +- pnpm-lock.yaml | 446 ++++++++++++++---- 17 files changed, 571 insertions(+), 224 deletions(-) create mode 100644 .github/workflows/pkg-pr-new.yaml diff --git a/.github/workflows/pkg-pr-new.yaml b/.github/workflows/pkg-pr-new.yaml new file mode 100644 index 00000000..03fc9f9e --- /dev/null +++ b/.github/workflows/pkg-pr-new.yaml @@ -0,0 +1,44 @@ +name: Publish Any Commit +on: + push: + branches: + - "**" + pull_request: + branches: + - "**" + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18] + + steps: + - uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.1.0 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile --strict-peer-dependencies=false + + - name: Build + run: | + cd packages/scan + NODE_ENV=production pnpm build + env: + NODE_ENV: production + + - name: Publish NPM Package to pkg-pr-new + run: pnpx pkg-pr-new publish ./packages/scan + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/package.json b/package.json index 7bc5a728..502f871a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "root", "private": true, "scripts": { - "build": "pnpm --parallel --filter=!extension build", + "build": "pnpm --parallel --filter=!extension build && echo '\\n\\x1b[43m\\x1b[30m⚠️ WARNING: MAKE SURE TO BUMP VERSION BEFORE BUILDING OR REBUILD AFTER BUMPING VERSION IF PUBLISHING ⚠️\\x1b[0m\\n\\n'", "dev": "pnpm --parallel --filter=!extension dev", "pack": "pnpm --parallel --filter=!extension pack", "pack:bump": "pnpm --filter scan pack:bump", diff --git a/packages/scan/package.json b/packages/scan/package.json index 1515210f..2efe11ef 100644 --- a/packages/scan/package.json +++ b/packages/scan/package.json @@ -214,7 +214,7 @@ "auto.d.ts" ], "scripts": { - "build": "NODE_ENV=production tsup", + "build": "NODE_ENV=production tsup && echo '\\n\\x1b[43m\\x1b[30m⚠️ WARNING: MAKE SURE TO BUMP VERSION BEFORE BUILDING OR REBUILD AFTER BUMPING VERSION ⚠️\\x1b[0m\\n\\n'", "postbuild": "pnpm copy-astro", "build:copy": "NODE_ENV=production tsup && cat dist/auto.global.js | pbcopy", "copy-astro": "cp -R src/core/monitor/params/astro dist/core/monitor/params", @@ -236,6 +236,7 @@ "@rollup/pluginutils": "^5.1.3", "@types/node": "^20.17.9", "bippy": "^0.0.14", + "esbuild": "^0.24.0", "estree-walker": "^3.0.3", "kleur": "^4.1.5", "mri": "^1.2.0", diff --git a/packages/scan/src/core/index.ts b/packages/scan/src/core/index.ts index 5abbbbea..a92d65d3 100644 --- a/packages/scan/src/core/index.ts +++ b/packages/scan/src/core/index.ts @@ -130,12 +130,13 @@ export type MonitoringOptions = Pick< interface Monitor { pendingRequests: number; - url: string | null; - apiKey: string | null; interactions: Array; - route: string | null; session: ReturnType; - path: string | null; + url: string | null; + route: string | null; + apiKey: string | null; + commit: string | null; + branch: string | null; } interface StoreType { diff --git a/packages/scan/src/core/monitor/index.ts b/packages/scan/src/core/monitor/index.ts index 6cd314ae..6966d6d6 100644 --- a/packages/scan/src/core/monitor/index.ts +++ b/packages/scan/src/core/monitor/index.ts @@ -14,41 +14,67 @@ import { addFiberToSet, isValidFiber, updateFiberRenderData } from '../utils'; import { initPerformanceMonitoring } from './performance'; import { getSession } from './utils'; import { flush } from './network'; +import { computeRoute } from './params/utils'; // max retries before the set of components do not get reported (avoid memory leaks of the set of fibers stored on the component aggregation) const MAX_RETRIES_BEFORE_COMPONENT_GC = 7; +export interface MonitoringProps { + url?: string; + apiKey: string; + + // For Session and Interaction + path?: string | null; // pathname (i.e /foo/2/bar/3) + route?: string | null; // computed from path and params (i.e /foo/:fooId/bar/:barId) + + // Only used / should be provided to compute the route when using Monitoring without supported framework + params?: Record; + + // Tracking regressions across commits and branches + commit?: string | null; + branch?: string | null; +} + +export type MonitoringWithoutRouteProps = Omit< + MonitoringProps, + 'route' | 'path' +>; + export const Monitoring = ({ url, apiKey, - path, - route, -}: { url?: string; apiKey: string } & { - // todo: ask for path + params so we can compute route for them - path: string; - route: string | null; -}) => { + params, + path = null, // path passed down would be reactive + route = null, + commit = null, + branch = null, +}: MonitoringProps) => { if (!apiKey) throw new Error('Please provide a valid API key for React Scan monitoring'); url ??= 'https://monitoring.react-scan.com/api/v1/ingest'; Store.monitor.value ??= { pendingRequests: 0, + interactions: [], + session: getSession({ commit, branch }).catch(() => null), url, apiKey, - interactions: [], - session: getSession().catch(() => null), route, - path, + commit, + branch, }; - Store.monitor.value.route = route; - Store.monitor.value.path = path; + + // When using Monitoring without framework, we need to compute the route from the path and params + if (!route && path && params) { + Store.monitor.value.route = computeRoute(path, params); + } else { + Store.monitor.value.route = + route ?? path ?? new URL(window.location.toString()).pathname; // this is inaccurate on vanilla react if the path is not provided but used for session route + } // eslint-disable-next-line import/no-named-as-default-member React.useEffect(() => { - scanMonitoring({ - enabled: true, - }); + scanMonitoring({ enabled: true }); return initPerformanceMonitoring(); }, []); diff --git a/packages/scan/src/core/monitor/network.ts b/packages/scan/src/core/monitor/network.ts index 693eb6f9..8c7ce5a2 100644 --- a/packages/scan/src/core/monitor/network.ts +++ b/packages/scan/src/core/monitor/network.ts @@ -6,19 +6,29 @@ import { MAX_PENDING_REQUESTS, } from './constants'; import { getSession } from './utils'; -import type { Interaction, IngestRequest, InternalInteraction } from './types'; - -const getInteractionId = (interaction: InternalInteraction) => - `${interaction.performanceEntry.type}::${interaction.componentPath}::${interaction.url}`; +import type { Interaction, IngestRequest, InternalInteraction, Component } from './types'; const INTERACTION_TIME_TILL_COMPLETED = 4000; -const splitInteractions = (interactions: Array) => { +export const flush = async (): Promise => { + const monitor = Store.monitor.value; + if ( + !monitor || + !navigator.onLine || + !monitor.url || + !monitor.interactions.length + ) { + return; + } const now = performance.now(); - const pendingInteractions: typeof interactions = []; - const completedInteractions: typeof interactions = []; - - interactions.forEach((interaction) => { + // We might trigger flush before the interaction is completed, + // so we need to split them into pending and completed by an arbitrary time. + const pendingInteractions = new Array(); + const completedInteractions = new Array(); + + const interactions = monitor.interactions; + for (let i = 0; i < interactions.length; i++) { + const interaction = interactions[i]; if ( now - interaction.performanceEntry.startTime <= INTERACTION_TIME_TILL_COMPLETED @@ -27,102 +37,63 @@ const splitInteractions = (interactions: Array) => { } else { completedInteractions.push(interaction); } - }); + } - return { pendingInteractions, completedInteractions }; -}; + // nothing to flush + if (!completedInteractions.length) return; -const aggregateComponents = (interactions: Array) => { - const aggregatedComponents: Array<{ - interactionId: string; - name: string; - renders: number; - instances: number; - totalTime?: number; - selfTime?: number; - }> = []; - - for (const interaction of interactions) { - for (const [name, component] of Array.from( - interaction.components.entries(), - )) { + // idempotent + const session = await getSession({ + commit: monitor.commit, + branch: monitor.branch, + }).catch(() => null); + + if (!session) return; + + const aggregatedComponents = new Array(); + const aggregatedInteractions = new Array(); + for (let i = 0; i < completedInteractions.length; i++) { + const interaction = completedInteractions[i]; + + aggregatedInteractions.push({ + id: i, + path: interaction.componentPath, + name: interaction.componentName, + time: interaction.performanceEntry.duration, + timestamp: interaction.performanceEntry.timestamp, + type: interaction.performanceEntry.type, + url: interaction.url, + route: interaction.route, + commit: interaction.commit, + branch: interaction.branch, + uniqueInteractionId: interaction.uniqueInteractionId, + }); + + const components = Array.from(interaction.components.entries()); + for (let j = 0; j < components.length; j++) { + const [name, component] = components[j]; aggregatedComponents.push({ name, instances: component.fibers.size, - interactionId: getInteractionId(interaction), + interactionId: i, renders: component.renders, totalTime: component.totalTime, }); - - if (component.retiresAllowed === 0) { - // otherwise there will be a memory leak if the user loses internet or our server goes down - // we decide to skip the collection if this is the case - interaction.components.delete(name); - } - - component.retiresAllowed -= 1; } } - return aggregatedComponents; -}; - -const toPayloadInteraction = (interactions: Array) => - interactions.map( - (interaction) => - ({ - id: getInteractionId(interaction), - name: interaction.componentName, - time: interaction.performanceEntry.duration, - timestamp: interaction.performanceEntry.timestamp, - type: interaction.performanceEntry.type, - route: interaction.route, - url: interaction.url, - uniqueInteractionId: interaction.uniqueInteractionId, - }) satisfies Interaction, - ); - -export const flush = async (): Promise => { - const monitor = Store.monitor.value; - if ( - !monitor || - !navigator.onLine || - !monitor.url || - !monitor.interactions.length - ) { - return; - } - const { completedInteractions, pendingInteractions } = splitInteractions( - monitor.interactions, - ); - - // nothing to flush - if (!completedInteractions.length) { - return; - } - // idempotent - const session = await getSession().catch(() => null); - - if (!session) return; - - const aggregatedComponents = aggregateComponents(monitor.interactions); const payload: IngestRequest = { - interactions: toPayloadInteraction(completedInteractions), + interactions: aggregatedInteractions, components: aggregatedComponents, session: { ...session, + url: window.location.toString(), + route: monitor.route, // this might be inaccurate but used to caculate which paths all the unique sessions are coming from without having to join on the interactions table (expensive) }, }; monitor.pendingRequests++; - // remove all completed interactions from batch - monitor.interactions = monitor.interactions.filter((interaction) => - completedInteractions.some( - (completedInteraction) => - completedInteraction.performanceEntry.id !== - interaction.performanceEntry.id, - ), - ); + monitor.interactions = pendingInteractions; try { transport(monitor.url, payload) .then(() => { diff --git a/packages/scan/src/core/monitor/params/astro/Monitoring.astro b/packages/scan/src/core/monitor/params/astro/Monitoring.astro index cbde58e9..8e77c352 100644 --- a/packages/scan/src/core/monitor/params/astro/Monitoring.astro +++ b/packages/scan/src/core/monitor/params/astro/Monitoring.astro @@ -9,8 +9,8 @@ interface Props { const { apiKey, url } = Astro.props; -const pathname = Astro.url.pathname; +const path = Astro.url.pathname; const params = Astro.params; --- - + diff --git a/packages/scan/src/core/monitor/params/astro/component.ts b/packages/scan/src/core/monitor/params/astro/component.ts index 8d0a0ed4..d37b578f 100644 --- a/packages/scan/src/core/monitor/params/astro/component.ts +++ b/packages/scan/src/core/monitor/params/astro/component.ts @@ -1,14 +1,14 @@ import { createElement } from 'react'; -import { Monitoring as BaseMonitoring } from '../..'; +import { Monitoring as BaseMonitoring, type MonitoringWithoutRouteProps } from '../..'; import { computeRoute } from '../utils'; export function AstroMonitor(props: { url?: string; apiKey: string; - pathname: string; + path: string; params: Record; -}) { - const path = props.pathname; +} & MonitoringWithoutRouteProps) { + const path = props.path; const route = computeRoute(path, props.params); return createElement(BaseMonitoring, { diff --git a/packages/scan/src/core/monitor/params/next.ts b/packages/scan/src/core/monitor/params/next.ts index 56ef2f13..f8785cf8 100644 --- a/packages/scan/src/core/monitor/params/next.ts +++ b/packages/scan/src/core/monitor/params/next.ts @@ -4,7 +4,7 @@ import { useParams, usePathname, useSearchParams } from 'next/navigation.js'; // import React from 'react'; import { createElement, Suspense } from 'react'; -import { Monitoring as BaseMonitoring } from '..'; +import { Monitoring as BaseMonitoring, type MonitoringWithoutRouteProps } from '..'; import { computeRoute } from './utils'; // import { computeRoute } from '../utils'; // does this work in pages and app router? Idk @@ -26,7 +26,7 @@ const useRoute = (): { : Object.fromEntries(searchParams.entries()); return { route: computeRoute(path, finalParams), path }; }; -export function MonitoringInner(props: { url?: string; apiKey: string }) { +export function MonitoringInner(props: MonitoringWithoutRouteProps) { const { route, path } = useRoute(); // we need to fix build so this doesn't get compiled to preact jsx @@ -37,7 +37,7 @@ export function MonitoringInner(props: { url?: string; apiKey: string }) { }); } -export function Monitoring(props: { url?: string; apiKey: string }) { +export function Monitoring(props: MonitoringWithoutRouteProps) { return createElement( Suspense, { fallback: null }, diff --git a/packages/scan/src/core/monitor/params/react-router-v5.ts b/packages/scan/src/core/monitor/params/react-router-v5.ts index 70e2f167..71b81206 100644 --- a/packages/scan/src/core/monitor/params/react-router-v5.ts +++ b/packages/scan/src/core/monitor/params/react-router-v5.ts @@ -1,6 +1,6 @@ import { createElement } from 'react'; import { useRouteMatch, useLocation } from 'react-router'; -import { Monitoring as BaseMonitoring} from '..'; +import { Monitoring as BaseMonitoring, type MonitoringWithoutRouteProps} from '..'; import { computeRoute } from './utils'; import type { RouteInfo } from './types'; @@ -19,7 +19,7 @@ const useRoute = (): RouteInfo => { }; }; -function ReactRouterV5Monitor(props: { url?: string; apiKey: string }) { +function ReactRouterV5Monitor(props: MonitoringWithoutRouteProps) { const { route, path } = useRoute(); return createElement(BaseMonitoring, { ...props, diff --git a/packages/scan/src/core/monitor/params/react-router-v6.ts b/packages/scan/src/core/monitor/params/react-router-v6.ts index 2be9c05a..d62f12f1 100644 --- a/packages/scan/src/core/monitor/params/react-router-v6.ts +++ b/packages/scan/src/core/monitor/params/react-router-v6.ts @@ -1,6 +1,6 @@ import { createElement } from 'react'; import { useParams, useLocation } from 'react-router'; -import { Monitoring as BaseMonitoring } from '..'; +import { Monitoring as BaseMonitoring, type MonitoringWithoutRouteProps } from '..'; import { computeReactRouterRoute } from './utils'; import type { RouteInfo } from './types'; @@ -22,7 +22,7 @@ const useRoute = (): RouteInfo => { }; }; -function ReactRouterMonitor(props: { url?: string; apiKey: string }) { +function ReactRouterMonitor(props: MonitoringWithoutRouteProps) { const { route, path } = useRoute(); return createElement(BaseMonitoring, { ...props, diff --git a/packages/scan/src/core/monitor/params/remix.ts b/packages/scan/src/core/monitor/params/remix.ts index 6b0e55f7..e9ff727a 100644 --- a/packages/scan/src/core/monitor/params/remix.ts +++ b/packages/scan/src/core/monitor/params/remix.ts @@ -1,6 +1,6 @@ import { createElement } from 'react'; import { useParams, useLocation } from '@remix-run/react'; -import { Monitoring as BaseMonitoring} from '..'; +import { Monitoring as BaseMonitoring, type MonitoringWithoutRouteProps} from '..'; import { computeReactRouterRoute } from './utils'; import type { RouteInfo } from './types'; @@ -20,7 +20,7 @@ const useRoute = (): RouteInfo => { }; }; -function RemixMonitor(props: { url?: string; apiKey: string }) { +function RemixMonitor(props: MonitoringWithoutRouteProps) { const { route, path } = useRoute(); return createElement(BaseMonitoring, { ...props, diff --git a/packages/scan/src/core/monitor/performance.ts b/packages/scan/src/core/monitor/performance.ts index 0501c96f..0a48444b 100644 --- a/packages/scan/src/core/monitor/performance.ts +++ b/packages/scan/src/core/monitor/performance.ts @@ -98,8 +98,8 @@ const isMinified = (name: string): boolean => { export function getInteractionPath( fiber: Fiber | null, filters: PathFilters = DEFAULT_FILTERS, -): string { - if (!fiber) return ''; +): Array { + if (!fiber) return []; const fullPath: Array = []; @@ -119,8 +119,7 @@ export function getInteractionPath( current = current.return; } - const normalized = normalizePath(fullPath); - return normalized; + return fullPath; } let currentMouseOver: Element; @@ -132,7 +131,7 @@ function getCleanComponentName(component: any): string { return name.replace(/^(Memo|Forward(Ref)?|With.*?)\((.*?)\)$/, '$3'); } -function normalizePath(path: Array): string { +export function normalizePath(path: Array): string { const cleaned = path.filter(Boolean); const deduped = cleaned.filter((name, i) => name !== cleaned[i - 1]); @@ -195,8 +194,11 @@ export function initPerformanceMonitoring(options?: Partial) { componentPath: path, performanceEntry: entry, components: new Map(), - route: Store.monitor.value?.route ?? null, url: window.location.toString(), + route: + Store.monitor.value?.route ?? new URL(window.location.href).pathname, + commit: Store.monitor.value?.commit ?? null, + branch: Store.monitor.value?.branch ?? null, uniqueInteractionId: entry.id, }); }); diff --git a/packages/scan/src/core/monitor/types.ts b/packages/scan/src/core/monitor/types.ts index 52d82f16..a95622d4 100644 --- a/packages/scan/src/core/monitor/types.ts +++ b/packages/scan/src/core/monitor/types.ts @@ -15,16 +15,26 @@ export interface Session { cpu: number; gpu: string | null; mem: number; + url: string; + route: string | null; + commit: string | null; + branch: string | null; } export interface Interaction { - id: string; // a hashed unique id for interaction (groupable across sessions) - name: string; // name of interaction (i.e nav#top-menu.sc-601d0142-19.gHiJkL) or something useful + id: string | number; // index of the interaction in the batch at ingest | server converts to a hashed string from route, type, name, path + path: Array; // the path of the interaction + name: string; // name of interaction type: string; // type of interaction i.e pointer time: number; // time of interaction in ms timestamp: number; - route: string | null; // the computed route that handles dynamic params url: string; + route: string | null; // the computed route that handles dynamic params + + // Regression tracking + commit: string | null; + branch: string | null; + // clickhouse + ingest specific types projectId?: string; sessionId?: string; @@ -32,7 +42,7 @@ export interface Interaction { } export interface Component { - interactionId: string; // grouping components by interaction + interactionId: string | number; // grouping components by interaction name: string; renders: number; // how many times it re-rendered / instances (normalized) instances: number; // instances which will be used to get number of total renders by * by renders @@ -51,8 +61,10 @@ export interface InternalInteraction { componentName: string; url: string; route: string | null; + commit: string | null; + branch: string | null; uniqueInteractionId: string; - componentPath: string; + componentPath: Array; performanceEntry: PerformanceInteraction; components: Map; } diff --git a/packages/scan/src/core/monitor/utils.ts b/packages/scan/src/core/monitor/utils.ts index 6b8b23da..376cda56 100644 --- a/packages/scan/src/core/monitor/utils.ts +++ b/packages/scan/src/core/monitor/utils.ts @@ -61,7 +61,13 @@ const getGpuRenderer = () => { * DO NOT CALL THIS EVERYTIME */ let cachedSession: Session; -export const getSession = async () => { +export const getSession = async ({ + commit = null, + branch = null, +}: { + commit?: string | null; + branch?: string | null; +}) => { if (isSSR) return null; if (cachedSession) { return cachedSession; @@ -102,12 +108,16 @@ export const getSession = async () => { const session = { id, url, + route: null, device: getDeviceType(), wifi, cpu, mem, gpu: await gpuRendererPromise, agent: navigator.userAgent, + commit, + branch, + version: process.env.NPM_PACKAGE_VERSION, }; cachedSession = session; return session; diff --git a/packages/scan/tsup.config.ts b/packages/scan/tsup.config.ts index 69a1d807..fa267b17 100644 --- a/packages/scan/tsup.config.ts +++ b/packages/scan/tsup.config.ts @@ -1,4 +1,5 @@ -import fs from 'node:fs/promises'; +import fsPromise from 'node:fs/promises'; +import * as fs from 'node:fs'; import path from 'node:path'; import { defineConfig } from 'tsup'; @@ -6,16 +7,16 @@ const DIST_PATH = './dist'; const addDirectivesToChunkFiles = async (readPath: string): Promise => { try { - const files = await fs.readdir(readPath); + const files = await fsPromise.readdir(readPath); for (const file of files) { if (file.endsWith('.mjs') || file.endsWith('.js')) { const filePath = path.join(readPath, file); - const data = await fs.readFile(filePath, 'utf8'); + const data = await fsPromise.readFile(filePath, 'utf8'); const updatedContent = `'use client';\n${data}`; - await fs.writeFile(filePath, updatedContent, 'utf8'); + await fsPromise.writeFile(filePath, updatedContent, 'utf8'); // eslint-disable-next-line no-console console.log(`Directive has been added to ${file}`); @@ -109,6 +110,11 @@ export default defineConfig([ minify: false, env: { NODE_ENV: process.env.NODE_ENV ?? 'development', + NPM_PACKAGE_VERSION: JSON.parse(fs.readFileSync( + path.join(__dirname, '../scan', 'package.json'), + 'utf8', + ), + ).version, }, external: [ 'react', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a6acefb..c32cfb33 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,11 +10,11 @@ importers: dependencies: '@vercel/speed-insights': specifier: ^1.1.0 - version: 1.1.0(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + version: 1.1.0(next@15.0.3(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) devDependencies: '@vercel/style-guide': specifier: ^6.0.0 - version: 6.0.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)(vitest@1.0.0(@types/node@22.10.1)(terser@5.36.0)) + version: 6.0.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)(vitest@1.0.0) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -72,7 +72,7 @@ importers: dependencies: '@vercel/analytics': specifier: ^1.4.0 - version: 1.4.0(@remix-run/react@2.15.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1)(typescript@5.6.3))(next@15.0.3(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@19.0.0-rc.1) + version: 1.4.0(@remix-run/react@2.15.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@19.0.0-rc.1) babel-plugin-react-compiler: specifier: 19.0.0-beta-a7bf2bd-20241110 version: 19.0.0-beta-a7bf2bd-20241110 @@ -128,6 +128,9 @@ importers: bippy: specifier: ^0.0.14 version: 0.0.14 + esbuild: + specifier: ^0.24.0 + version: 0.24.0 estree-walker: specifier: ^3.0.3 version: 3.0.3 @@ -219,13 +222,13 @@ importers: dependencies: '@vercel/analytics': specifier: ^1.4.1 - version: 1.4.1(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + version: 1.4.1(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) '@vercel/speed-insights': specifier: ^1.1.0 - version: 1.1.0(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + version: 1.1.0(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) next: specifier: 15.0.3 - version: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + version: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) react: specifier: 19.0.0-rc-66855b96-20241106 version: 19.0.0-rc-66855b96-20241106 @@ -234,7 +237,7 @@ importers: version: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106) react-scan: specifier: ^0.0.42 - version: 0.0.42(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react-router-dom@6.28.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-router@6.28.0(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(rollup@4.28.0) + version: 0.0.42(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react-router-dom@6.28.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-router@6.28.0(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(rollup@4.28.0) zod: specifier: ^3.23.8 version: 3.23.8 @@ -405,6 +408,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -423,6 +432,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -441,6 +456,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -459,6 +480,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -477,6 +504,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -495,6 +528,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -513,6 +552,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -531,6 +576,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -549,6 +600,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -567,6 +624,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -585,6 +648,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -603,6 +672,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -621,6 +696,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -639,6 +720,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -657,6 +744,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -675,6 +768,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -693,6 +792,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -711,12 +816,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -735,6 +852,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -753,6 +876,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -771,6 +900,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -789,6 +924,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -807,6 +948,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2203,6 +2350,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4760,6 +4912,9 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true @@ -4769,6 +4924,9 @@ snapshots: '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.18.20': optional: true @@ -4778,6 +4936,9 @@ snapshots: '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.18.20': optional: true @@ -4787,6 +4948,9 @@ snapshots: '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.24.0': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true @@ -4796,6 +4960,9 @@ snapshots: '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.24.0': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true @@ -4805,6 +4972,9 @@ snapshots: '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.24.0': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true @@ -4814,6 +4984,9 @@ snapshots: '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.24.0': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true @@ -4823,6 +4996,9 @@ snapshots: '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.24.0': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true @@ -4832,6 +5008,9 @@ snapshots: '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.24.0': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true @@ -4841,6 +5020,9 @@ snapshots: '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.24.0': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true @@ -4850,6 +5032,9 @@ snapshots: '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.24.0': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true @@ -4859,6 +5044,9 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.24.0': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true @@ -4868,6 +5056,9 @@ snapshots: '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.24.0': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true @@ -4877,6 +5068,9 @@ snapshots: '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.24.0': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true @@ -4886,6 +5080,9 @@ snapshots: '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.24.0': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true @@ -4895,6 +5092,9 @@ snapshots: '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.24.0': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true @@ -4904,6 +5104,9 @@ snapshots: '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.24.0': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true @@ -4913,9 +5116,15 @@ snapshots: '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.24.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.24.0': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true @@ -4925,6 +5134,9 @@ snapshots: '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true @@ -4934,6 +5146,9 @@ snapshots: '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true @@ -4943,6 +5158,9 @@ snapshots: '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true @@ -4952,6 +5170,9 @@ snapshots: '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true @@ -4961,6 +5182,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.24.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -5616,21 +5840,26 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vercel/analytics@1.4.0(@remix-run/react@2.15.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1)(typescript@5.6.3))(next@15.0.3(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@19.0.0-rc.1)': + '@vercel/analytics@1.4.0(@remix-run/react@2.15.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@19.0.0-rc.1)': optionalDependencies: '@remix-run/react': 2.15.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1)(typescript@5.6.3) - next: 15.0.3(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) + next: 15.0.3(@babel/core@7.26.0)(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) react: 19.0.0-rc.1 - '@vercel/analytics@1.4.1(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)': + '@vercel/analytics@1.4.1(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)': optionalDependencies: '@remix-run/react': 2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3) - next: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + next: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + react: 19.0.0-rc-66855b96-20241106 + + '@vercel/speed-insights@1.1.0(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)': + optionalDependencies: + next: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) react: 19.0.0-rc-66855b96-20241106 - '@vercel/speed-insights@1.1.0(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)': + '@vercel/speed-insights@1.1.0(next@15.0.3(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)': optionalDependencies: - next: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + next: 15.0.3(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106) react: 19.0.0-rc-66855b96-20241106 '@vercel/style-guide@6.0.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)(vitest@1.0.0(@types/node@20.17.9)(terser@5.36.0))': @@ -5641,7 +5870,7 @@ snapshots: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3) eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.0.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) @@ -5667,7 +5896,7 @@ snapshots: - supports-color - vitest - '@vercel/style-guide@6.0.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)(vitest@1.0.0(@types/node@22.10.1)(terser@5.36.0))': + '@vercel/style-guide@6.0.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)(vitest@1.0.0)': dependencies: '@babel/core': 7.26.0 '@babel/eslint-parser': 7.25.9(@babel/core@7.26.0)(eslint@8.57.1) @@ -5675,10 +5904,10 @@ snapshots: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3) eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-playwright: 1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) @@ -5687,7 +5916,7 @@ snapshots: eslint-plugin-testing-library: 6.5.0(eslint@8.57.1)(typescript@5.6.3) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 51.0.1(eslint@8.57.1) - eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)(vitest@1.0.0(@types/node@22.10.1)(terser@5.36.0)) + eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)(vitest@1.0.0) prettier-plugin-packagejson: 2.5.6(prettier@3.3.3) optionalDependencies: eslint: 8.57.1 @@ -6537,6 +6766,33 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escalade@3.2.0: {} escape-goat@4.0.0: {} @@ -6569,9 +6825,9 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.0.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -6587,7 +6843,7 @@ snapshots: debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 @@ -6606,13 +6862,13 @@ snapshots: debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.0.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -6629,7 +6885,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -6640,7 +6907,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -6685,35 +6952,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.0.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - string.prototype.trimend: 1.0.8 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 @@ -6725,7 +6963,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -6787,7 +7025,7 @@ snapshots: eslint: 8.57.1 globals: 13.24.0 optionalDependencies: - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: @@ -6865,13 +7103,13 @@ snapshots: - supports-color - typescript - eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)(vitest@1.0.0(@types/node@22.10.1)(terser@5.36.0)): + eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)(vitest@1.0.0): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - vitest: 1.0.0(@types/node@22.10.1)(terser@5.36.0) + vitest: 1.0.0 transitivePeerDependencies: - supports-color - typescript @@ -7788,6 +8026,33 @@ snapshots: ncp@2.0.0: optional: true + next@15.0.3(@babel/core@7.26.0)(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): + dependencies: + '@next/env': 15.0.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001684 + postcss: 8.4.31 + react: 19.0.0-rc.1 + react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.3 + '@next/swc-darwin-x64': 15.0.3 + '@next/swc-linux-arm64-gnu': 15.0.3 + '@next/swc-linux-arm64-musl': 15.0.3 + '@next/swc-linux-x64-gnu': 15.0.3 + '@next/swc-linux-x64-musl': 15.0.3 + '@next/swc-win32-arm64-msvc': 15.0.3 + '@next/swc-win32-x64-msvc': 15.0.3 + babel-plugin-react-compiler: 19.0.0-beta-a7bf2bd-20241110 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + optional: true + next@15.0.3(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 15.0.3 @@ -7813,7 +8078,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.0.3(babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): + next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106): dependencies: '@next/env': 15.0.3 '@swc/counter': 0.1.3 @@ -7821,9 +8086,9 @@ snapshots: busboy: 1.6.0 caniuse-lite: 1.0.30001684 postcss: 8.4.31 - react: 19.0.0-rc.1 - react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) - styled-jsx: 5.1.6(react@19.0.0-rc.1) + react: 19.0.0-rc-66855b96-20241106 + react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106) optionalDependencies: '@next/swc-darwin-arm64': 15.0.3 '@next/swc-darwin-x64': 15.0.3 @@ -7833,14 +8098,12 @@ snapshots: '@next/swc-linux-x64-musl': 15.0.3 '@next/swc-win32-arm64-msvc': 15.0.3 '@next/swc-win32-x64-msvc': 15.0.3 - babel-plugin-react-compiler: 19.0.0-beta-a7bf2bd-20241110 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - optional: true - next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106): + next@15.0.3(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106): dependencies: '@next/env': 15.0.3 '@swc/counter': 0.1.3 @@ -7849,8 +8112,7 @@ snapshots: caniuse-lite: 1.0.30001684 postcss: 8.4.31 react: 19.0.0-rc-66855b96-20241106 - react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106) - styled-jsx: 5.1.6(react@19.0.0-rc-66855b96-20241106) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106) optionalDependencies: '@next/swc-darwin-arm64': 15.0.3 '@next/swc-darwin-x64': 15.0.3 @@ -7864,6 +8126,7 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + optional: true node-forge@1.3.1: {} @@ -8290,7 +8553,7 @@ snapshots: mri: 1.2.0 playwright: 1.49.0 - react-scan@0.0.42(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react-router-dom@6.28.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-router@6.28.0(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(rollup@4.28.0): + react-scan@0.0.42(@remix-run/react@2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3))(next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react-router-dom@6.28.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react-router@6.28.0(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(rollup@4.28.0): dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.2 @@ -8312,7 +8575,7 @@ snapshots: unplugin: 2.0.0-beta.2 optionalDependencies: '@remix-run/react': 2.15.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.6.3) - next: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + next: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) react-router: 6.28.0(react@19.0.0-rc-66855b96-20241106) react-router-dom: 6.28.0(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) transitivePeerDependencies: @@ -8764,15 +9027,19 @@ snapshots: optionalDependencies: '@babel/core': 7.26.0 - styled-jsx@5.1.6(react@19.0.0-rc-66855b96-20241106): + styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0-rc-66855b96-20241106): dependencies: client-only: 0.0.1 react: 19.0.0-rc-66855b96-20241106 + optionalDependencies: + '@babel/core': 7.26.0 - styled-jsx@5.1.6(react@19.0.0-rc.1): + styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0-rc.1): dependencies: client-only: 0.0.1 react: 19.0.0-rc.1 + optionalDependencies: + '@babel/core': 7.26.0 optional: true sucrase@3.35.0: @@ -9074,13 +9341,13 @@ snapshots: value-equal@1.0.1: {} - vite-node@1.0.0(@types/node@20.17.9)(terser@5.36.0): + vite-node@1.0.0: dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.3(@types/node@20.17.9)(terser@5.36.0) + vite: 5.4.3 transitivePeerDependencies: - '@types/node' - less @@ -9091,14 +9358,15 @@ snapshots: - sugarss - supports-color - terser + optional: true - vite-node@1.0.0(@types/node@22.10.1)(terser@5.36.0): + vite-node@1.0.0(@types/node@20.17.9)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.3(@types/node@22.10.1)(terser@5.36.0) + vite: 5.4.3(@types/node@20.17.9)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -9109,7 +9377,6 @@ snapshots: - sugarss - supports-color - terser - optional: true vite-plugin-inspect@0.8.7(rollup@4.28.0)(vite@5.4.3(@types/node@22.10.1)(terser@5.36.0)): dependencies: @@ -9154,6 +9421,15 @@ snapshots: - terser - utf-8-validate + vite@5.4.3: + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.28.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + vite@5.4.3(@types/node@20.17.9)(terser@5.36.0): dependencies: esbuild: 0.21.5 @@ -9174,7 +9450,7 @@ snapshots: fsevents: 2.3.3 terser: 5.36.0 - vitest@1.0.0(@types/node@20.17.9)(terser@5.36.0): + vitest@1.0.0: dependencies: '@vitest/expect': 1.0.0 '@vitest/runner': 1.0.0 @@ -9194,11 +9470,9 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.3(@types/node@20.17.9)(terser@5.36.0) - vite-node: 1.0.0(@types/node@20.17.9)(terser@5.36.0) + vite: 5.4.3 + vite-node: 1.0.0 why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 20.17.9 transitivePeerDependencies: - less - lightningcss @@ -9208,8 +9482,9 @@ snapshots: - sugarss - supports-color - terser + optional: true - vitest@1.0.0(@types/node@22.10.1)(terser@5.36.0): + vitest@1.0.0(@types/node@20.17.9)(terser@5.36.0): dependencies: '@vitest/expect': 1.0.0 '@vitest/runner': 1.0.0 @@ -9229,11 +9504,11 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.3(@types/node@22.10.1)(terser@5.36.0) - vite-node: 1.0.0(@types/node@22.10.1)(terser@5.36.0) + vite: 5.4.3(@types/node@20.17.9)(terser@5.36.0) + vite-node: 1.0.0(@types/node@20.17.9)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 20.17.9 transitivePeerDependencies: - less - lightningcss @@ -9243,7 +9518,6 @@ snapshots: - sugarss - supports-color - terser - optional: true watchpack@2.4.1: dependencies: From 8483e385f0995551c6fbd4f24c439899467335bc Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Thu, 12 Dec 2024 00:51:10 -0800 Subject: [PATCH 4/4] build(scan): Update TypeScript configuration for cli.mts --- packages/scan/tsup.config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/scan/tsup.config.ts b/packages/scan/tsup.config.ts index fa267b17..bfefcb62 100644 --- a/packages/scan/tsup.config.ts +++ b/packages/scan/tsup.config.ts @@ -129,6 +129,9 @@ export default defineConfig([ }, { entry: ['./src/cli.mts'], + banner: { + js: banner, + }, outDir: './dist', splitting: false, clean: true,