{"meta":{"generatedAt":"2026-07-05T12:06:17.736Z","toolVersion":"0.1.2","root":"/home/yash/Repo/atlas/examples/sample-app","framework":{"next":false,"nextRouter":"none","vite":false,"reactRouter":true,"tanstackRouter":false,"react":true,"stateLibs":["zustand"]},"workspaces":[]},"components":[{"id":"src/ProductList.tsx#ProductList","name":"ProductList","type":"component","path":"src/ProductList.tsx","exportType":"named","location":{"filePath":"src/ProductList.tsx","line":21,"column":0},"jsDoc":"ProductList — renders products grouped by category, with an\n\"add to cart\" action and infinite scrolling.","signature":"<ProductList …props />","componentKind":"function","props":[{"name":"products","type":"Product[]","optional":false}],"defaultProps":{},"rendersComponents":["Button","Badge","Avatar"],"dependencies":["src/cart-state.ts#useCartStore","src/stuff.tsx#useInfiniteScroll","src/misc-helpers.ts#groupBy","src/fancy-inputs.tsx#Badge","src/stuff.tsx#Avatar","src/misc-helpers.ts#formatCurrency","src/widgets.tsx#Button"],"usedIn":[{"filePath":"src/routes.tsx","line":15,"kind":"jsx"}],"usageCount":1,"examples":[],"tags":["component","function","exported"],"description":{"purpose":"ProductList — renders products grouped by category, with an \"add to cart\" action and infinite scrolling.","responsibilities":["Render its UI from 1 prop (products required).","Compose Button, Badge and Avatar."],"inputs":"Props — products: Product[].","outputs":"A rendered React element, composed of Button, Badge and Avatar.","dependencies":["src/cart-state.ts#useCartStore","src/stuff.tsx#useInfiniteScroll","src/misc-helpers.ts#groupBy","src/fancy-inputs.tsx#Badge","src/stuff.tsx#Avatar","src/misc-helpers.ts#formatCurrency","src/widgets.tsx#Button"],"whenToUse":"Reach for `<ProductList />` when you need a data-display element; you must pass products.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<ProductList products={…} />","examples":["<ProductList products={products} />"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}},{"id":"src/auth-bits.tsx#AuthProvider","name":"AuthProvider","type":"component","path":"src/auth-bits.tsx","exportType":"named","location":{"filePath":"src/auth-bits.tsx","line":27,"column":0},"jsDoc":"AuthProvider — wraps the app and exposes auth state via context.","signature":"<AuthProvider …props />","componentKind":"function","props":[{"name":"children","type":"React.ReactNode","optional":false}],"propsTypeName":"AuthProviderProps","defaultProps":{},"rendersComponents":["AuthContext"],"dependencies":["src/auth-bits.tsx#AuthContext"],"usedIn":[{"filePath":"src/routes.tsx","line":12,"kind":"jsx"},{"filePath":"src/routes.tsx","line":19,"kind":"reference"}],"usageCount":2,"examples":[],"tags":["component","function","exported"],"description":{"purpose":"AuthProvider — wraps the app and exposes auth state via context.","responsibilities":["Render its UI from 1 prop (children required).","Compose AuthContext."],"inputs":"Props — children: React.ReactNode.","outputs":"A rendered React element, composed of AuthContext.","dependencies":["src/auth-bits.tsx#AuthContext"],"whenToUse":"Reach for `<AuthProvider />` when you need a React component; you must pass children.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<AuthProvider children={…} />","examples":["<AuthProvider children={children} />"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}},{"id":"src/fancy-inputs.tsx#TextInput","name":"TextInput","type":"component","path":"src/fancy-inputs.tsx","exportType":"named","location":{"filePath":"src/fancy-inputs.tsx","line":13,"column":13},"signature":"<TextInput …props />","componentKind":"forwardRef","props":[{"name":"onChange","type":"any","optional":false},{"name":"placeholder","type":"any","optional":false},{"name":"value","type":"any","optional":false}],"defaultProps":{},"rendersComponents":[],"dependencies":[],"usedIn":[{"filePath":"src/fancy-inputs.tsx","line":26,"kind":"reference"},{"filePath":"src/login-screen.tsx","line":27,"kind":"jsx"},{"filePath":"src/login-screen.tsx","line":28,"kind":"jsx"}],"usageCount":3,"examples":[],"tags":["component","forwardRef","exported"],"description":{"purpose":"`TextInput` is a form control for \"text input\". Referenced in 3 places.","responsibilities":["Render its UI from 3 props (onChange, placeholder and value required).","Forward a ref to a DOM/child node."],"inputs":"Props — onChange: any, placeholder: any and value: any.","outputs":"A rendered React element.","dependencies":[],"whenToUse":"Reach for `<TextInput />` when you need a form control; you must pass onChange, placeholder and value.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<TextInput onChange={…} placeholder={…} value={…} />","examples":["<TextInput onChange={onChange} placeholder={placeholder} value={value} />"],"improvements":["Add a one-line JSDoc summary so this description can quote your intent instead of inferring it.","Tighten prop types — onChange, placeholder and value are untyped/any."],"source":"heuristic"}},{"id":"src/fancy-inputs.tsx#Badge","name":"Badge","type":"component","path":"src/fancy-inputs.tsx","exportType":"named","location":{"filePath":"src/fancy-inputs.tsx","line":36,"column":13},"signature":"<Badge …props />","componentKind":"memo","props":[{"name":"label","type":"string","optional":false},{"name":"tone","type":"\"info\" | \"warn\" | \"error\" | undefined","optional":true,"defaultValue":"'info'"}],"propsTypeName":"BadgeProps","defaultProps":{"tone":"'info'"},"rendersComponents":[],"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":32,"kind":"jsx"},{"filePath":"src/fancy-inputs.tsx","line":36,"kind":"reference"}],"usageCount":2,"examples":[],"tags":["component","memo","exported"],"description":{"purpose":"`Badge` is a small visual element for \"badge\". Referenced in 2 places.","responsibilities":["Render its UI from 2 props (label required).","Skip re-renders when props are unchanged (memoized)."],"inputs":"Props — label: string and tone?: \"info\" | \"warn\" | \"error\" | undefined.","outputs":"A rendered React element.","dependencies":[],"whenToUse":"Reach for `<Badge />` when you need a small visual element; you must pass label.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<Badge label={…} />","examples":["<Badge label={label} />"],"improvements":["Add a one-line JSDoc summary so this description can quote your intent instead of inferring it."],"source":"heuristic"}},{"id":"src/login-screen.tsx#LoginScreen","name":"LoginScreen","type":"component","path":"src/login-screen.tsx","exportType":"named","location":{"filePath":"src/login-screen.tsx","line":11,"column":0},"jsDoc":"LoginScreen — email/password form wired to the auth context.","signature":"<LoginScreen />","componentKind":"function","props":[],"defaultProps":{},"rendersComponents":["Button","TextInput"],"dependencies":["src/auth-bits.tsx#useAuth","src/timing.ts#useDebounce","src/misc-helpers.ts#isEmail","src/fancy-inputs.tsx#TextInput","src/widgets.tsx#Button"],"usedIn":[{"filePath":"src/routes.tsx","line":16,"kind":"jsx"}],"usageCount":1,"examples":[],"tags":["component","function","exported","no-props"],"description":{"purpose":"LoginScreen — email/password form wired to the auth context.","responsibilities":["Render a self-contained, prop-less UI.","Compose Button and TextInput."],"inputs":"No props; it is fully self-contained.","outputs":"A rendered React element, composed of Button and TextInput.","dependencies":["src/auth-bits.tsx#useAuth","src/timing.ts#useDebounce","src/misc-helpers.ts#isEmail","src/fancy-inputs.tsx#TextInput","src/widgets.tsx#Button"],"whenToUse":"Reach for `<LoginScreen />` when you need a page-level layout.","whenNotToUse":"If you need configurable behaviour, prefer a component that accepts props rather than copying this one.","commonUsage":"<LoginScreen />","examples":["<LoginScreen />"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}},{"id":"src/orphan-banner.tsx#PromoBanner","name":"PromoBanner","type":"component","path":"src/orphan-banner.tsx","exportType":"named","location":{"filePath":"src/orphan-banner.tsx","line":12,"column":0},"jsDoc":"PromoBanner — DELIBERATELY UNUSED component (no other module imports or\nrenders it) so dead-code / orphan detection has something to find.","signature":"<PromoBanner …props />","componentKind":"function","props":[{"name":"dismissible","type":"boolean | undefined","optional":true,"defaultValue":"true"},{"name":"message","type":"string","optional":false}],"propsTypeName":"PromoBannerProps","defaultProps":{"dismissible":"true"},"rendersComponents":[],"dependencies":[],"usedIn":[],"usageCount":0,"examples":[],"tags":["component","function","exported"],"description":{"purpose":"PromoBanner — DELIBERATELY UNUSED component (no other module imports or renders it) so dead-code / orphan detection has something to find.","responsibilities":["Render its UI from 2 props (message required)."],"inputs":"Props — dismissible?: boolean | undefined and message: string.","outputs":"A rendered React element.","dependencies":[],"whenToUse":"Reach for `<PromoBanner />` when you need a feedback element; you must pass message.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<PromoBanner message={…} />","examples":["<PromoBanner message={message} />"],"improvements":["No references found — confirm it is a real entry point or remove it as dead code."],"source":"heuristic"}},{"id":"src/routes.tsx#AppRoutes","name":"AppRoutes","type":"component","path":"src/routes.tsx","exportType":"named","location":{"filePath":"src/routes.tsx","line":10,"column":0},"jsDoc":"AppRoutes — top-level react-router configuration wrapped in AuthProvider.","signature":"<AppRoutes />","componentKind":"function","props":[],"defaultProps":{},"rendersComponents":["AuthProvider","BrowserRouter","Routes","Route","ProductList","LoginScreen"],"dependencies":["src/auth-bits.tsx#AuthProvider","src/ProductList.tsx#ProductList","src/login-screen.tsx#LoginScreen"],"usedIn":[],"usageCount":0,"examples":[],"tags":["component","function","exported","no-props"],"description":{"purpose":"AppRoutes — top-level react-router configuration wrapped in AuthProvider.","responsibilities":["Render a self-contained, prop-less UI.","Compose AuthProvider, BrowserRouter, Routes, Route and …."],"inputs":"No props; it is fully self-contained.","outputs":"A rendered React element, composed of AuthProvider, BrowserRouter, Routes, Route and ….","dependencies":["src/auth-bits.tsx#AuthProvider","src/ProductList.tsx#ProductList","src/login-screen.tsx#LoginScreen"],"whenToUse":"Reach for `<AppRoutes />` when you need a React component.","whenNotToUse":"If you need configurable behaviour, prefer a component that accepts props rather than copying this one.","commonUsage":"<AppRoutes />","examples":["<AppRoutes />"],"improvements":["No references found — confirm it is a real entry point or remove it as dead code."],"source":"heuristic"}},{"id":"src/stuff.tsx#Avatar","name":"Avatar","type":"component","path":"src/stuff.tsx","exportType":"default","location":{"filePath":"src/stuff.tsx","line":12,"column":6},"signature":"<Avatar …props />","componentKind":"arrow","props":[{"name":"alt","type":"string | undefined","optional":true,"defaultValue":"'avatar'"},{"name":"size","type":"number | undefined","optional":true,"defaultValue":"40"},{"name":"src","type":"string","optional":false}],"propsTypeName":"AvatarProps","defaultProps":{"alt":"'avatar'","size":"40"},"rendersComponents":[],"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":35,"kind":"jsx"},{"filePath":"src/stuff.tsx","line":24,"kind":"reference"}],"usageCount":2,"examples":[],"tags":["component","arrow"],"description":{"purpose":"`Avatar` is a small visual element for \"avatar\". Referenced in 2 places.","responsibilities":["Render its UI from 3 props (src required)."],"inputs":"Props — alt?: string | undefined, size?: number | undefined and src: string.","outputs":"A rendered React element.","dependencies":[],"whenToUse":"Reach for `<Avatar />` when you need a small visual element; you must pass src.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<Avatar src={…} />","examples":["<Avatar src={src} />"],"improvements":["Add a one-line JSDoc summary so this description can quote your intent instead of inferring it."],"source":"heuristic"}},{"id":"src/widgets.tsx#Button","name":"Button","type":"component","path":"src/widgets.tsx","exportType":"named","location":{"filePath":"src/widgets.tsx","line":23,"column":0},"jsDoc":"Primary action button used across the app.\n\nSupports variants, sizes, and a loading state. Prefer this over a raw\n`<button>` so styling and a11y stay consistent.","signature":"<Button …props />","componentKind":"function","props":[{"name":"children","type":"any","optional":true},{"name":"disabled","type":"boolean | undefined","optional":true,"description":"Disable the button.","defaultValue":"false"},{"name":"loading","type":"boolean | undefined","optional":true,"description":"Show a loading spinner and block interaction.","defaultValue":"false"},{"name":"onClick","type":"(() => void) | undefined","optional":true,"description":"Click handler."},{"name":"size","type":"\"sm\" | \"md\" | \"lg\" | undefined","optional":true,"description":"Size token.","defaultValue":"'md'"},{"name":"variant","type":"\"primary\" | \"secondary\" | \"ghost\" | undefined","optional":true,"description":"Visual style of the button.","defaultValue":"'primary'"}],"propsTypeName":"ButtonProps","defaultProps":{"variant":"'primary'","size":"'md'","loading":"false","disabled":"false"},"rendersComponents":[],"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":38,"kind":"jsx"},{"filePath":"src/ProductList.tsx","line":44,"kind":"reference"},{"filePath":"src/login-screen.tsx","line":29,"kind":"jsx"},{"filePath":"src/login-screen.tsx","line":31,"kind":"reference"},{"filePath":"src/widgets.tsx","line":42,"kind":"reference"}],"usageCount":5,"examples":[],"tags":["component","function","exported"],"description":{"purpose":"Primary action button used across the app. Supports variants, sizes, and a loading state. Prefer this over a raw `<button>` so styling and a11y stay consistent.","responsibilities":["Render its UI from 6 props (all optional)."],"inputs":"Props — children?: any, disabled?: boolean | undefined, loading?: boolean | undefined, onClick?: (() => void) | undefined, size?: \"sm\" | \"md\" | \"lg\" | undefined and variant?: \"primary\" | \"secondary\" | \"ghost\" | undefined.","outputs":"A rendered React element.","dependencies":[],"whenToUse":"Reach for `<Button />` when you need an interactive control.","whenNotToUse":"Avoid forcing unrelated variations through new props — split into a separate component once the prop surface gets conditional.","commonUsage":"<Button />","examples":["<Button />"],"improvements":["Tighten prop types — children is untyped/any."],"source":"heuristic"}}],"hooks":[{"id":"src/auth-bits.tsx#useAuth","name":"useAuth","type":"hook","path":"src/auth-bits.tsx","exportType":"named","location":{"filePath":"src/auth-bits.tsx","line":46,"column":0},"jsDoc":"useAuth — read the auth context. Throws if used outside an AuthProvider.","signature":"useAuth()","params":[],"returnType":"AuthContextValue","reactHooksUsed":["useContext"],"callsHooks":[],"dependencies":["src/auth-bits.tsx#AuthContext"],"usedIn":[{"filePath":"src/login-screen.tsx","line":12,"kind":"call"}],"usageCount":1,"examples":[],"tags":["hook","exported","consumes-context"],"description":{"purpose":"useAuth — read the auth context. Throws if used outside an AuthProvider.","responsibilities":["Internally reads React context.","Hand back AuthContextValue for the caller to consume."],"inputs":"Takes no arguments.","outputs":"Returns AuthContextValue.","dependencies":["src/auth-bits.tsx#AuthContext"],"whenToUse":"Call `useAuth()` inside a component or another hook to reuse this logic instead of re-implementing it.","whenNotToUse":"Never call it conditionally, in a loop, or outside React render — it must obey the Rules of Hooks.","commonUsage":"const auth = useAuth();","examples":["const auth = useAuth();"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}},{"id":"src/stuff.tsx#useInfiniteScroll","name":"useInfiniteScroll","type":"hook","path":"src/stuff.tsx","exportType":"named","location":{"filePath":"src/stuff.tsx","line":32,"column":0},"jsDoc":"useInfiniteScroll — a custom hook colocated in a component file on purpose,\nto prove detection is path-independent.\n\nCalls `onLoadMore` when the sentinel nears the viewport.","signature":"useInfiniteScroll(onLoadMore, hasMore)","params":[{"name":"onLoadMore","type":"() => void","optional":false},{"name":"hasMore","type":"boolean","optional":false}],"returnType":"(node: HTMLElement | null) => void","reactHooksUsed":["useState","useEffect"],"callsHooks":[],"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":24,"kind":"call"}],"usageCount":1,"examples":[],"tags":["hook","exported","stateful","effectful"],"description":{"purpose":"useInfiniteScroll — a custom hook colocated in a component file on purpose, to prove detection is path-independent. Calls `onLoadMore` when the sentinel nears the viewport.","responsibilities":["Internally owns local state and runs side effects.","Hand back (node: HTMLElement | null) => void for the caller to consume."],"inputs":"Arguments — onLoadMore: () => void and hasMore: boolean.","outputs":"Returns (node: HTMLElement | null) => void.","dependencies":[],"whenToUse":"Call `useInfiniteScroll(onLoadMore, hasMore)` inside a component or another hook to reuse this logic instead of re-implementing it.","whenNotToUse":"Never call it conditionally, in a loop, or outside React render — it must obey the Rules of Hooks.","commonUsage":"const scroll = useInfiniteScroll(onLoadMore, hasMore);","examples":["const scroll = useInfiniteScroll(onLoadMore, hasMore);"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}},{"id":"src/timing.ts#useDebounce","name":"useDebounce","type":"hook","path":"src/timing.ts","exportType":"named","location":{"filePath":"src/timing.ts","line":11,"column":0},"jsDoc":"useDebounce — returns a debounced copy of `value` that only updates\nafter `delayMs` of quiet time.","signature":"useDebounce(value, delayMs)","params":[{"name":"value","type":"T","optional":false},{"name":"delayMs","type":"number","optional":false}],"returnType":"T","reactHooksUsed":["useState","useEffect"],"callsHooks":[],"dependencies":[],"usedIn":[{"filePath":"src/login-screen.tsx","line":17,"kind":"call"}],"usageCount":1,"examples":[],"tags":["hook","exported","stateful","effectful"],"description":{"purpose":"useDebounce — returns a debounced copy of `value` that only updates after `delayMs` of quiet time.","responsibilities":["Internally owns local state and runs side effects.","Hand back T for the caller to consume."],"inputs":"Arguments — value: T and delayMs: number.","outputs":"Returns T.","dependencies":[],"whenToUse":"Call `useDebounce(value, delayMs)` inside a component or another hook to reuse this logic instead of re-implementing it.","whenNotToUse":"Never call it conditionally, in a loop, or outside React render — it must obey the Rules of Hooks.","commonUsage":"const debounce = useDebounce(value, delayMs);","examples":["const debounce = useDebounce(value, delayMs);"],"improvements":["Looks solid — no obvious heuristic improvements."],"source":"heuristic"}}],"utils":[{"id":"src/misc-helpers.ts#formatCurrency","name":"formatCurrency","type":"utility","path":"src/misc-helpers.ts","exportType":"named","location":{"filePath":"src/misc-helpers.ts","line":8,"column":0},"jsDoc":"formatCurrency — format a number as a localized currency string.","signature":"formatCurrency(amount: number, currency: string, locale: string): string","utilKind":"formatter","params":[{"name":"amount","type":"number","optional":false},{"name":"currency","type":"string","optional":true,"defaultValue":"'USD'"},{"name":"locale","type":"string","optional":true,"defaultValue":"'en-US'"}],"returnType":"string","isAsync":false,"pure":true,"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":37,"kind":"call"}],"usageCount":1,"examples":[],"tags":["utility","formatter","exported","pure"],"description":{"purpose":"formatCurrency — format a number as a localized currency string.","responsibilities":["Use it to turn a value into a display-ready string.","Produce the same output for the same input — safe to call anywhere, including during render."],"inputs":"Arguments — amount: number, currency?: string and locale?: string.","outputs":"Returns string.","dependencies":[],"whenToUse":"Call `formatCurrency(amount, currency, locale)` to turn a value into a display-ready string.","whenNotToUse":"It carries no React/stateful behaviour — use a hook if you need state, effects, or context.","commonUsage":"const result = formatCurrency(amount, currency, locale);","examples":["const result = formatCurrency(amount, currency, locale);"],"improvements":["Pure function — a great candidate for fast, isolated unit tests."],"source":"heuristic"}},{"id":"src/misc-helpers.ts#isEmail","name":"isEmail","type":"utility","path":"src/misc-helpers.ts","exportType":"named","location":{"filePath":"src/misc-helpers.ts","line":22,"column":0},"jsDoc":"isEmail — validate that a string looks like an email address.","signature":"isEmail(value: string): boolean","utilKind":"validator","params":[{"name":"value","type":"string","optional":false}],"returnType":"boolean","isAsync":false,"pure":true,"dependencies":[],"usedIn":[{"filePath":"src/login-screen.tsx","line":18,"kind":"call"}],"usageCount":1,"examples":[],"tags":["utility","validator","exported","pure"],"description":{"purpose":"isEmail — validate that a string looks like an email address.","responsibilities":["Use it to check a condition and branch on the result.","Produce the same output for the same input — safe to call anywhere, including during render."],"inputs":"Arguments — value: string.","outputs":"Returns boolean.","dependencies":[],"whenToUse":"Call `isEmail(value)` to check a condition and branch on the result.","whenNotToUse":"It carries no React/stateful behaviour — use a hook if you need state, effects, or context.","commonUsage":"const result = isEmail(value);","examples":["const result = isEmail(value);"],"improvements":["Pure function — a great candidate for fast, isolated unit tests."],"source":"heuristic"}},{"id":"src/misc-helpers.ts#groupBy","name":"groupBy","type":"utility","path":"src/misc-helpers.ts","exportType":"named","location":{"filePath":"src/misc-helpers.ts","line":33,"column":0},"jsDoc":"groupBy — group items of an array by a derived string key.","signature":"groupBy(items: readonly T[], keyFn: (item: T) => string): Record<string, T[]>","utilKind":"helper","params":[{"name":"items","type":"readonly T[]","optional":false},{"name":"keyFn","type":"(item: T) => string","optional":false}],"returnType":"Record<string, T[]>","isAsync":false,"pure":true,"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":26,"kind":"call"}],"usageCount":1,"examples":[],"tags":["utility","helper","exported","pure"],"description":{"purpose":"groupBy — group items of an array by a derived string key.","responsibilities":["Use it to reshape or constrain data.","Produce the same output for the same input — safe to call anywhere, including during render."],"inputs":"Arguments — items: readonly T[] and keyFn: (item: T) => string.","outputs":"Returns Record<string, T[]>.","dependencies":[],"whenToUse":"Call `groupBy(items, keyFn)` to reshape or constrain data.","whenNotToUse":"It carries no React/stateful behaviour — use a hook if you need state, effects, or context.","commonUsage":"const result = groupBy(items, keyFn);","examples":["const result = groupBy(items, keyFn);"],"improvements":["Pure function — a great candidate for fast, isolated unit tests."],"source":"heuristic"}},{"id":"src/misc-helpers.ts#slugify","name":"slugify","type":"utility","path":"src/misc-helpers.ts","exportType":"named","location":{"filePath":"src/misc-helpers.ts","line":51,"column":0},"jsDoc":"slugify — DELIBERATELY UNUSED utility to exercise dead-code detection.","signature":"slugify(text: string): string","utilKind":"formatter","params":[{"name":"text","type":"string","optional":false}],"returnType":"string","isAsync":false,"pure":true,"dependencies":[],"usedIn":[],"usageCount":0,"examples":[],"tags":["utility","formatter","exported","pure"],"description":{"purpose":"slugify — DELIBERATELY UNUSED utility to exercise dead-code detection.","responsibilities":["Use it to reuse this logic without duplicating it.","Produce the same output for the same input — safe to call anywhere, including during render."],"inputs":"Arguments — text: string.","outputs":"Returns string.","dependencies":[],"whenToUse":"Call `slugify(text)` to reuse this logic without duplicating it.","whenNotToUse":"It carries no React/stateful behaviour — use a hook if you need state, effects, or context.","commonUsage":"const result = slugify(text);","examples":["const result = slugify(text);"],"improvements":["No references found — confirm it is a real entry point or remove it as dead code.","Pure function — a great candidate for fast, isolated unit tests."],"source":"heuristic"}}],"contexts":[{"id":"src/auth-bits.tsx#AuthContext","name":"AuthContext","type":"context","path":"src/auth-bits.tsx","exportType":"named","location":{"filePath":"src/auth-bits.tsx","line":18,"column":13},"signature":"createContext(…) → AuthContext","stateKind":"react-context","stateShape":[],"dependencies":[],"usedIn":[{"filePath":"src/auth-bits.tsx","line":37,"kind":"jsx"},{"filePath":"src/auth-bits.tsx","line":39,"kind":"reference"},{"filePath":"src/auth-bits.tsx","line":47,"kind":"reference"}],"usageCount":3,"examples":[],"tags":["state","react-context","context"],"description":{"purpose":"`AuthContext` is a react-context context sharing application state across the tree. Referenced in 3 places.","responsibilities":["Expose shared state via react-context so consumers skip prop-drilling.","Surface state fields (shape not statically resolved)."],"inputs":"No direct inputs — consumers read from it on demand.","outputs":"Shared state for consumers.","dependencies":[],"whenToUse":"Use it when its state fields must be read or updated by components far apart in the tree.","whenNotToUse":"Skip it for state used by a single component or its immediate children — local state re-renders far less.","commonUsage":"const value = useContext(AuthContext);","examples":["const { value } = useContext(AuthContext);"],"improvements":["Add a one-line JSDoc summary so this description can quote your intent instead of inferring it.","Type the exposed state shape so consumers know what is available."],"source":"heuristic"}},{"id":"src/cart-state.ts#useCartStore","name":"useCartStore","type":"store","path":"src/cart-state.ts","exportType":"named","location":{"filePath":"src/cart-state.ts","line":21,"column":13},"signature":"create(…) → useCartStore","stateKind":"zustand","stateShape":["items","total","addItem","removeItem","clear"],"dependencies":[],"usedIn":[{"filePath":"src/ProductList.tsx","line":23,"kind":"call"}],"usageCount":1,"examples":[],"tags":["state","zustand","store"],"description":{"purpose":"`useCartStore` is a zustand store sharing items, total, addItem, removeItem and … across the tree. Referenced in 1 place, so changes here are low-risk.","responsibilities":["Expose shared state via zustand so consumers skip prop-drilling.","Surface items, total, addItem, removeItem and …."],"inputs":"No direct inputs — consumers read from it on demand.","outputs":"Shared state: items, total, addItem, removeItem and clear.","dependencies":[],"whenToUse":"Use it when items, total, addItem, removeItem and … must be read or updated by components far apart in the tree.","whenNotToUse":"Skip it for state used by a single component or its immediate children — local state re-renders far less.","commonUsage":"const state = useCartStore();","examples":["const items = useCartStore();"],"improvements":["Add a one-line JSDoc summary so this description can quote your intent instead of inferring it."],"source":"heuristic"}}],"routes":[{"id":"src/routes.tsx#route:/:react-router:ProductList#0","name":"/ → ProductList","type":"route","path":"src/routes.tsx","exportType":"none","location":{"filePath":"src/routes.tsx","line":1,"column":0},"signature":"react-router /","router":"react-router","routePath":"/","componentName":"ProductList","childRoutes":[],"segmentKind":"route","dependencies":[],"usedIn":[],"usageCount":0,"examples":[],"tags":["route","react-router","route"],"description":{"purpose":"react-router route serving `/`, rendering ProductList. Currently has no internal references — it may be an entry point, public API, or dead code.","responsibilities":["Match navigation to `/`.","Render the ProductList view."],"inputs":"URL `/` (static).","outputs":"The ProductList view.","dependencies":[],"whenToUse":"Navigate to `/` to land on this route.","whenNotToUse":"This is a routing entry, not a reusable component — don't import it into other views; lift shared UI into a component instead.","commonUsage":"navigate(\"/\")","examples":["<Link to=\"/\">…</Link>"],"improvements":["No references found — confirm it is a real entry point or remove it as dead code.","Add a one-line JSDoc summary so this description can quote your intent instead of inferring it.","Add route-level loading and error boundaries."],"source":"heuristic"}},{"id":"src/routes.tsx#route:/login:react-router:LoginScreen#1","name":"/login → LoginScreen","type":"route","path":"src/routes.tsx","exportType":"none","location":{"filePath":"src/routes.tsx","line":1,"column":0},"signature":"react-router /login","router":"react-router","routePath":"/login","componentName":"LoginScreen","childRoutes":[],"segmentKind":"route","dependencies":[],"usedIn":[],"usageCount":0,"examples":[],"tags":["route","react-router","route"],"description":{"purpose":"react-router route serving `/login`, rendering LoginScreen. Currently has no internal references — it may be an entry point, public API, or dead code.","responsibilities":["Match navigation to `/login`.","Render the LoginScreen view."],"inputs":"URL `/login` (static).","outputs":"The LoginScreen view.","dependencies":[],"whenToUse":"Navigate to `/login` to land on this route.","whenNotToUse":"This is a routing entry, not a reusable component — don't import it into other views; lift shared UI into a component instead.","commonUsage":"navigate(\"/login\")","examples":["<Link to=\"/login\">…</Link>"],"improvements":["No references found — confirm it is a real entry point or remove it as dead code.","Add a one-line JSDoc summary so this description can quote your intent instead of inferring it.","Add route-level loading and error boundaries."],"source":"heuristic"}}],"graph":{"nodes":[{"id":"src/ProductList.tsx#ProductList","label":"ProductList","type":"component","path":"src/ProductList.tsx","usageCount":1},{"id":"src/auth-bits.tsx#AuthProvider","label":"AuthProvider","type":"component","path":"src/auth-bits.tsx","usageCount":2},{"id":"src/auth-bits.tsx#useAuth","label":"useAuth","type":"hook","path":"src/auth-bits.tsx","usageCount":1},{"id":"src/auth-bits.tsx#AuthContext","label":"AuthContext","type":"context","path":"src/auth-bits.tsx","usageCount":3},{"id":"src/cart-state.ts#useCartStore","label":"useCartStore","type":"store","path":"src/cart-state.ts","usageCount":1},{"id":"src/fancy-inputs.tsx#TextInput","label":"TextInput","type":"component","path":"src/fancy-inputs.tsx","usageCount":3},{"id":"src/fancy-inputs.tsx#Badge","label":"Badge","type":"component","path":"src/fancy-inputs.tsx","usageCount":2},{"id":"src/login-screen.tsx#LoginScreen","label":"LoginScreen","type":"component","path":"src/login-screen.tsx","usageCount":1},{"id":"src/misc-helpers.ts#formatCurrency","label":"formatCurrency","type":"utility","path":"src/misc-helpers.ts","usageCount":1},{"id":"src/misc-helpers.ts#isEmail","label":"isEmail","type":"utility","path":"src/misc-helpers.ts","usageCount":1},{"id":"src/misc-helpers.ts#groupBy","label":"groupBy","type":"utility","path":"src/misc-helpers.ts","usageCount":1},{"id":"src/misc-helpers.ts#slugify","label":"slugify","type":"utility","path":"src/misc-helpers.ts","usageCount":0},{"id":"src/orphan-banner.tsx#PromoBanner","label":"PromoBanner","type":"component","path":"src/orphan-banner.tsx","usageCount":0},{"id":"src/routes.tsx#AppRoutes","label":"AppRoutes","type":"component","path":"src/routes.tsx","usageCount":0},{"id":"src/routes.tsx#route:/:react-router:ProductList#0","label":"/ → ProductList","type":"route","path":"src/routes.tsx","usageCount":0},{"id":"src/routes.tsx#route:/login:react-router:LoginScreen#1","label":"/login → LoginScreen","type":"route","path":"src/routes.tsx","usageCount":0},{"id":"src/stuff.tsx#Avatar","label":"Avatar","type":"component","path":"src/stuff.tsx","usageCount":2},{"id":"src/stuff.tsx#useInfiniteScroll","label":"useInfiniteScroll","type":"hook","path":"src/stuff.tsx","usageCount":1},{"id":"src/timing.ts#useDebounce","label":"useDebounce","type":"hook","path":"src/timing.ts","usageCount":1},{"id":"src/widgets.tsx#Button","label":"Button","type":"component","path":"src/widgets.tsx","usageCount":5}],"edges":[{"from":"src/ProductList.tsx#ProductList","to":"src/cart-state.ts#useCartStore","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/stuff.tsx#useInfiniteScroll","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/misc-helpers.ts#groupBy","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/fancy-inputs.tsx#Badge","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/stuff.tsx#Avatar","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/misc-helpers.ts#formatCurrency","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/widgets.tsx#Button","kind":"uses"},{"from":"src/ProductList.tsx#ProductList","to":"src/widgets.tsx#Button","kind":"renders"},{"from":"src/ProductList.tsx#ProductList","to":"src/fancy-inputs.tsx#Badge","kind":"renders"},{"from":"src/ProductList.tsx#ProductList","to":"src/stuff.tsx#Avatar","kind":"renders"},{"from":"src/auth-bits.tsx#AuthProvider","to":"src/auth-bits.tsx#AuthContext","kind":"uses"},{"from":"src/auth-bits.tsx#AuthProvider","to":"src/auth-bits.tsx#AuthContext","kind":"renders"},{"from":"src/auth-bits.tsx#useAuth","to":"src/auth-bits.tsx#AuthContext","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/auth-bits.tsx#useAuth","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/timing.ts#useDebounce","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/misc-helpers.ts#isEmail","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/fancy-inputs.tsx#TextInput","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/widgets.tsx#Button","kind":"uses"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/widgets.tsx#Button","kind":"renders"},{"from":"src/login-screen.tsx#LoginScreen","to":"src/fancy-inputs.tsx#TextInput","kind":"renders"},{"from":"src/routes.tsx#AppRoutes","to":"src/auth-bits.tsx#AuthProvider","kind":"uses"},{"from":"src/routes.tsx#AppRoutes","to":"src/ProductList.tsx#ProductList","kind":"uses"},{"from":"src/routes.tsx#AppRoutes","to":"src/login-screen.tsx#LoginScreen","kind":"uses"},{"from":"src/routes.tsx#AppRoutes","to":"src/auth-bits.tsx#AuthProvider","kind":"renders"},{"from":"src/routes.tsx#AppRoutes","to":"src/ProductList.tsx#ProductList","kind":"renders"},{"from":"src/routes.tsx#AppRoutes","to":"src/login-screen.tsx#LoginScreen","kind":"renders"}]},"deadCode":{"unusedComponents":[{"id":"src/orphan-banner.tsx#PromoBanner","name":"PromoBanner","path":"src/orphan-banner.tsx","type":"component"},{"id":"src/routes.tsx#AppRoutes","name":"AppRoutes","path":"src/routes.tsx","type":"component"}],"unusedHooks":[],"unusedUtils":[{"id":"src/misc-helpers.ts#slugify","name":"slugify","path":"src/misc-helpers.ts","type":"utility"}],"unusedContexts":[],"deadExports":[{"id":"src/misc-helpers.ts#slugify","name":"slugify","path":"src/misc-helpers.ts","type":"utility"},{"id":"src/orphan-banner.tsx#PromoBanner","name":"PromoBanner","path":"src/orphan-banner.tsx","type":"component"},{"id":"src/routes.tsx#AppRoutes","name":"AppRoutes","path":"src/routes.tsx","type":"component"}],"orphanFiles":["src/orphan-banner.tsx","src/routes.tsx"],"duplicateCandidates":[]},"architecture":{"folderStructure":{"name":".","path":"","fileCount":11,"assetCount":20,"children":[{"name":"src","path":"src","fileCount":11,"assetCount":20,"children":[]}]},"modules":[{"name":"(root)","path":"(root)","assetCount":20,"dependsOn":[]}],"sharedLayer":[],"violations":[]},"search":[{"id":"src/ProductList.tsx#ProductList","name":"ProductList","type":"component","path":"src/ProductList.tsx","description":"ProductList — renders products grouped by category, with an \"add to cart\" action and infinite scrolling.","tags":["component","function","exported"],"keywords":["product","list","component","function","exported","products","src"]},{"id":"src/auth-bits.tsx#AuthProvider","name":"AuthProvider","type":"component","path":"src/auth-bits.tsx","description":"AuthProvider — wraps the app and exposes auth state via context.","tags":["component","function","exported"],"keywords":["auth","provider","component","function","exported","children","src","bits"]},{"id":"src/auth-bits.tsx#useAuth","name":"useAuth","type":"hook","path":"src/auth-bits.tsx","description":"useAuth — read the auth context. Throws if used outside an AuthProvider.","tags":["hook","exported","consumes-context"],"keywords":["use","auth","hook","exported","consumes-context","src","bits"]},{"id":"src/auth-bits.tsx#AuthContext","name":"AuthContext","type":"context","path":"src/auth-bits.tsx","description":"`AuthContext` is a react-context context sharing application state across the tree. Referenced in 3 places.","tags":["state","react-context","context"],"keywords":["auth","context","state","react-context","src","bits"]},{"id":"src/cart-state.ts#useCartStore","name":"useCartStore","type":"store","path":"src/cart-state.ts","description":"`useCartStore` is a zustand store sharing items, total, addItem, removeItem and … across the tree. Referenced in 1 place, so changes here are low-risk.","tags":["state","zustand","store"],"keywords":["use","cart","store","state","zustand","items","total","add","item","remove","clear","src"]},{"id":"src/fancy-inputs.tsx#TextInput","name":"TextInput","type":"component","path":"src/fancy-inputs.tsx","description":"`TextInput` is a form control for \"text input\". Referenced in 3 places.","tags":["component","forwardRef","exported"],"keywords":["text","input","component","forwardref","exported","on","change","placeholder","value","src","fancy","inputs"]},{"id":"src/fancy-inputs.tsx#Badge","name":"Badge","type":"component","path":"src/fancy-inputs.tsx","description":"`Badge` is a small visual element for \"badge\". Referenced in 2 places.","tags":["component","memo","exported"],"keywords":["badge","component","memo","exported","label","tone","src","fancy","inputs"]},{"id":"src/login-screen.tsx#LoginScreen","name":"LoginScreen","type":"component","path":"src/login-screen.tsx","description":"LoginScreen — email/password form wired to the auth context.","tags":["component","function","exported","no-props"],"keywords":["login","screen","component","function","exported","no-props","src"]},{"id":"src/misc-helpers.ts#formatCurrency","name":"formatCurrency","type":"utility","path":"src/misc-helpers.ts","description":"formatCurrency — format a number as a localized currency string.","tags":["utility","formatter","exported","pure"],"keywords":["format","currency","utility","formatter","exported","pure","amount","locale","src","misc","helpers"]},{"id":"src/misc-helpers.ts#isEmail","name":"isEmail","type":"utility","path":"src/misc-helpers.ts","description":"isEmail — validate that a string looks like an email address.","tags":["utility","validator","exported","pure"],"keywords":["is","email","utility","validator","exported","pure","value","src","misc","helpers"]},{"id":"src/misc-helpers.ts#groupBy","name":"groupBy","type":"utility","path":"src/misc-helpers.ts","description":"groupBy — group items of an array by a derived string key.","tags":["utility","helper","exported","pure"],"keywords":["group","by","utility","helper","exported","pure","items","key","fn","src","misc","helpers"]},{"id":"src/misc-helpers.ts#slugify","name":"slugify","type":"utility","path":"src/misc-helpers.ts","description":"slugify — DELIBERATELY UNUSED utility to exercise dead-code detection.","tags":["utility","formatter","exported","pure"],"keywords":["slugify","utility","formatter","exported","pure","text","src","misc","helpers"]},{"id":"src/orphan-banner.tsx#PromoBanner","name":"PromoBanner","type":"component","path":"src/orphan-banner.tsx","description":"PromoBanner — DELIBERATELY UNUSED component (no other module imports or renders it) so dead-code / orphan detection has something to find.","tags":["component","function","exported"],"keywords":["promo","banner","component","function","exported","dismissible","message","src","orphan"]},{"id":"src/routes.tsx#AppRoutes","name":"AppRoutes","type":"component","path":"src/routes.tsx","description":"AppRoutes — top-level react-router configuration wrapped in AuthProvider.","tags":["component","function","exported","no-props"],"keywords":["app","routes","component","function","exported","no-props","src"]},{"id":"src/routes.tsx#route:/:react-router:ProductList#0","name":"/ → ProductList","type":"route","path":"src/routes.tsx","description":"react-router route serving `/`, rendering ProductList. Currently has no internal references — it may be an entry point, public API, or dead code.","tags":["route","react-router","route"],"keywords":["/","→","product","list","route","react-router","src","routes"]},{"id":"src/routes.tsx#route:/login:react-router:LoginScreen#1","name":"/login → LoginScreen","type":"route","path":"src/routes.tsx","description":"react-router route serving `/login`, rendering LoginScreen. Currently has no internal references — it may be an entry point, public API, or dead code.","tags":["route","react-router","route"],"keywords":["/login","→","login","screen","route","react-router","src","routes"]},{"id":"src/stuff.tsx#Avatar","name":"Avatar","type":"component","path":"src/stuff.tsx","description":"`Avatar` is a small visual element for \"avatar\". Referenced in 2 places.","tags":["component","arrow"],"keywords":["avatar","component","arrow","alt","size","src","stuff"]},{"id":"src/stuff.tsx#useInfiniteScroll","name":"useInfiniteScroll","type":"hook","path":"src/stuff.tsx","description":"useInfiniteScroll — a custom hook colocated in a component file on purpose, to prove detection is path-independent. Calls `onLoadMore` when the sentinel nears the viewport.","tags":["hook","exported","stateful","effectful"],"keywords":["use","infinite","scroll","hook","exported","stateful","effectful","on","load","more","has","src","stuff"]},{"id":"src/timing.ts#useDebounce","name":"useDebounce","type":"hook","path":"src/timing.ts","description":"useDebounce — returns a debounced copy of `value` that only updates after `delayMs` of quiet time.","tags":["hook","exported","stateful","effectful"],"keywords":["use","debounce","hook","exported","stateful","effectful","value","delay","ms","src","timing"]},{"id":"src/widgets.tsx#Button","name":"Button","type":"component","path":"src/widgets.tsx","description":"Primary action button used across the app. Supports variants, sizes, and a loading state. Prefer this over a raw `<button>` so styling and a11y stay consistent.","tags":["component","function","exported"],"keywords":["button","component","function","exported","children","disabled","loading","on","click","size","variant","src","widgets"]}],"stats":{"fileCount":11,"components":9,"hooks":3,"utils":4,"contexts":2,"routes":2,"unusedExports":3,"duplicateCandidates":0,"durationMs":1194}}