@@ -2,7 +2,6 @@ import * as React from 'react'
22import { createFileRoute , Link } from '@tanstack/react-router'
33import { z } from 'zod'
44import {
5- MdArrowBack ,
65 MdClose ,
76 MdLock ,
87 MdLockOpen ,
@@ -16,9 +15,66 @@ import { ParentSize } from '@visx/responsive'
1615import { Tooltip } from '~/components/Tooltip'
1716import * as d3 from 'd3'
1817import { useCombobox } from 'downshift'
19- import { FaAngleRight , FaArrowLeft , FaSpinner } from 'react-icons/fa'
18+ import { FaAngleRight , FaSpinner } from 'react-icons/fa'
2019import { HexColorPicker } from 'react-colorful'
21- import { getLibrary } from '~/libraries'
20+ import { seo } from '~/utils/seo'
21+
22+ export const Route = createFileRoute ( '/stats/npm/' ) ( {
23+ validateSearch : z . object ( {
24+ packages : z
25+ . array (
26+ z . object ( {
27+ packages : z . array ( z . string ( ) ) ,
28+ color : z . string ( ) . nullable ( ) . optional ( ) ,
29+ } )
30+ )
31+ . optional ( )
32+ . default ( [
33+ {
34+ packages : [ 'react' ] ,
35+ color : '#4da6d1' ,
36+ } ,
37+ {
38+ packages : [ '@tanstack/query-core' , 'react-query' ] ,
39+ color : '#ff4500' ,
40+ } ,
41+ ] ) ,
42+ range : z
43+ . enum ( [
44+ '7-days' ,
45+ '30-days' ,
46+ '90-days' ,
47+ '180-days' ,
48+ '365-days' ,
49+ '730-days' ,
50+ '1825-days' ,
51+ 'all-time' ,
52+ ] )
53+ . optional ( )
54+ . default ( '365-days' ) ,
55+ baseline : z . string ( ) . optional ( ) ,
56+ viewMode : z . enum ( [ 'absolute' , 'relative' ] ) . optional ( ) ,
57+ binningOption : z . enum ( [ 'yearly' , 'monthly' , 'weekly' , 'daily' ] ) . optional ( ) ,
58+ alignStartDates : z . boolean ( ) . optional ( ) . default ( false ) ,
59+ height : z . number ( ) . optional ( ) . default ( 400 ) ,
60+ } ) ,
61+ loaderDeps : ( { search } ) => ( {
62+ packages : search . packages ,
63+ range : search . range ,
64+ } ) ,
65+ loader : async ( { deps } ) => {
66+ return deps
67+ } ,
68+ head : ( { loaderData } ) => ( {
69+ meta : seo ( {
70+ title : `NPM Download Stats by TanStack- ${ loaderData . packages
71+ ?. map ( ( p ) => p . packages )
72+ . join ( ' vs ' ) } `,
73+ description : `Explore and compare download statistics of one or more NPM packages over various time ranges. Analyze trends, growth patterns, and historical data to make informed decisions on package usage and popularity. ` ,
74+ } ) ,
75+ } ) ,
76+ component : RouteComponent ,
77+ } )
2278
2379type NpmStats = {
2480 start : string
@@ -110,8 +166,6 @@ const defaultColors = [
110166 '#17becf' , // cyan
111167] as const
112168
113- type PackageColor = ( typeof defaultColors ) [ number ]
114-
115169function npmQueryOptions ( {
116170 packages,
117171 range,
@@ -731,52 +785,6 @@ function NpmStatsChart({
731785 )
732786}
733787
734- export const Route = createFileRoute ( '/stats/npm/' ) ( {
735- validateSearch : z . object ( {
736- packages : z
737- . array (
738- z . object ( {
739- packages : z . array ( z . string ( ) ) ,
740- color : z . string ( ) . nullable ( ) . optional ( ) ,
741- } )
742- )
743- . optional ( )
744- . default ( [
745- {
746- packages : [ 'react' ] ,
747- color : '#4da6d1' ,
748- } ,
749- {
750- packages : [ '@tanstack/query-core' , 'react-query' ] ,
751- color : '#ff4500' ,
752- } ,
753- ] ) ,
754- range : z
755- . enum ( [
756- '7-days' ,
757- '30-days' ,
758- '90-days' ,
759- '180-days' ,
760- '365-days' ,
761- '730-days' ,
762- '1825-days' ,
763- 'all-time' ,
764- ] )
765- . optional ( )
766- . default ( '365-days' ) ,
767- baseline : z . string ( ) . optional ( ) ,
768- viewMode : z . enum ( [ 'absolute' , 'relative' ] ) . optional ( ) ,
769- binningOption : z . enum ( [ 'yearly' , 'monthly' , 'weekly' , 'daily' ] ) . optional ( ) ,
770- alignStartDates : z . boolean ( ) . optional ( ) . default ( false ) ,
771- height : z . number ( ) . optional ( ) . default ( 400 ) ,
772- } ) ,
773- loaderDeps : ( { search } ) => ( {
774- packages : search . packages ,
775- range : search . range ,
776- } ) ,
777- component : RouteComponent ,
778- } )
779-
780788function PackageSearch ( ) {
781789 const [ items , setItems ] = React . useState < NpmPackage [ ] > ( [ ] )
782790 const [ isLoading , setIsLoading ] = React . useState ( false )
0 commit comments