Skip to content

Commit 79c83cb

Browse files
committed
Clarify cache modes across package callers
1 parent 3934389 commit 79c83cb

19 files changed

Lines changed: 145 additions & 75 deletions

__tests__/errors-cache.test.ts

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
11
import fetch from 'node-fetch'
22

3-
const baseURL = 'http://127.0.0.1:5000/api/size?package='
3+
import type { PackageBuildInfo } from '../types/package-domain'
4+
import { createPackageApiPath } from '../utils/packageApi.utils'
45

5-
type PackageSizeResponse = {
6+
const packageSizeUrl = (packageString: string) =>
7+
`http://127.0.0.1:5000${createPackageApiPath('size', packageString)}`
8+
9+
type PackageSizeResponse = PackageBuildInfo & {
610
scoped: boolean
7-
name: string
8-
version: string
9-
description: string
10-
repository: string
11-
dependencyCount: number
12-
hasJSNext: boolean
13-
hasJSModule: boolean
14-
hasSideEffects: boolean
15-
size: number
16-
gzip: number
17-
dependencySizes: Array<{ name: string; approximateSize: number }>
18-
ignoredMissingDependencies?: string[]
1911
}
2012

2113
type ErrorResponse = {
@@ -29,7 +21,7 @@ jest.setTimeout(15000)
2921

3022
describe('build api', () => {
3123
it('builds correct packages', async () => {
32-
const resultURL = baseURL + 'react@16.5.0'
24+
const resultURL = packageSizeUrl('react@16.5.0')
3325
const result = await fetch(resultURL)
3426
const resultJSON: PackageSizeResponse = await result.json()
3527

@@ -54,7 +46,7 @@ describe('build api', () => {
5446
})
5547

5648
it('handles hash bang in the beginning of packages', async () => {
57-
const resultURL = baseURL + '@bundlephobia/test-build-error'
49+
const resultURL = packageSizeUrl('@bundlephobia/test-build-error')
5850
const result = await fetch(resultURL)
5951
const resultJSON: PackageSizeResponse = await result.json()
6052

@@ -65,7 +57,7 @@ describe('build api', () => {
6557
})
6658

6759
it('gives right error messages on when trying to build blocklisted packages', async () => {
68-
const resultURL = baseURL + 'polymer-cli'
60+
const resultURL = packageSizeUrl('polymer-cli')
6961
const result = await fetch(resultURL)
7062
const errorJSON: ErrorResponse = await result.json()
7163

@@ -80,7 +72,7 @@ describe('build api', () => {
8072
})
8173

8274
it('gives right error messages on when trying to build entry point error ', async () => {
83-
const resultURL = baseURL + '@bundlephobia/test-entry-point-error'
75+
const resultURL = packageSizeUrl('@bundlephobia/test-entry-point-error')
8476
const result = await fetch(resultURL)
8577
const errorJSON: ErrorResponse = await result.json()
8678

@@ -93,7 +85,7 @@ describe('build api', () => {
9385
})
9486

9587
it('ignores errors when trying to build packages with missing dependency errors', async () => {
96-
const resultURL = baseURL + '@bundlephobia/missing-dependency-error'
88+
const resultURL = packageSizeUrl('@bundlephobia/missing-dependency-error')
9789
const result = await fetch(resultURL)
9890
const resultJSON: PackageSizeResponse = await result.json()
9991

@@ -107,7 +99,7 @@ describe('build api', () => {
10799
})
108100

109101
it("gives right error messages on when trying to build packages that don't exist", async () => {
110-
const resultURL = baseURL + '@bundlephobia/does-not-exist'
102+
const resultURL = packageSizeUrl('@bundlephobia/does-not-exist')
111103
const result = await fetch(resultURL)
112104
const errorJSON: ErrorResponse = await result.json()
113105

@@ -120,7 +112,9 @@ describe('build api', () => {
120112
})
121113

122114
it("gives right error messages on when trying to build packages versions that don't exist", async () => {
123-
const resultURL = baseURL + '@bundlephobia/test-entry-point-error@459.0.0'
115+
const resultURL = packageSizeUrl(
116+
'@bundlephobia/test-entry-point-error@459.0.0'
117+
)
124118
const result = await fetch(resultURL)
125119
const errorJSON: ErrorResponse = await result.json()
126120

__tests__/package-size-service.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ describe('PackageSizeService', () => {
131131
)
132132
})
133133

134-
it('refreshes package resolution instead of returning cached size data', async () => {
134+
it('force-rebuilds instead of returning cached size data', async () => {
135135
const { service, getCachedPackageSize, resolvePackageRequest } =
136136
createService()
137137
getCachedPackageSize.mockResolvedValue(cachedResult)
@@ -145,7 +145,9 @@ describe('PackageSizeService', () => {
145145
})
146146

147147
await expect(
148-
service.findPackageSize(createPackageRequest('react@18.2.0', 'refresh'))
148+
service.findPackageSize(
149+
createPackageRequest('react@18.2.0', 'force-rebuild')
150+
)
149151
).resolves.toEqual({
150152
kind: 'cache-miss',
151153
resolvedPackage: expect.objectContaining({ version: '19.0.0' }),

__tests__/utils.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { parsePackageString } from '../utils/common.utils'
2+
import {
3+
createPackageApiPath,
4+
isPackageCacheMode,
5+
} from '../utils/packageApi.utils'
26

37
describe('parsePackageString', () => {
48
it('handles scoped packages correctly', () => {
@@ -55,3 +59,23 @@ describe('parsePackageString', () => {
5559
})
5660
})
5761
})
62+
63+
describe('package API request contract', () => {
64+
it('builds one encoded URL for package API callers', () => {
65+
expect(
66+
createPackageApiPath('size', '@scope/pkg@1.2.3', {
67+
cacheMode: 'force-rebuild',
68+
record: true,
69+
})
70+
).toBe(
71+
'/api/size?package=%40scope%2Fpkg%401.2.3&cache=force-rebuild&record=true'
72+
)
73+
})
74+
75+
it('accepts only the shared cache modes', () => {
76+
expect(isPackageCacheMode('cache-first')).toBe(true)
77+
expect(isPackageCacheMode('force-rebuild')).toBe(true)
78+
expect(isPackageCacheMode('cache-only')).toBe(true)
79+
expect(isPackageCacheMode('unknown')).toBe(false)
80+
})
81+
})

bin/updateHistoricalData.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import fetch from 'node-fetch'
77
import trending from 'trending-github'
88

99
import firebaseUtils from '../utils/firebase.utils'
10+
import { createPackageApiPath } from '../utils/packageApi.utils'
1011

1112
import 'dotenv/config'
1213

@@ -89,7 +90,7 @@ async function getTrendingSearches() {
8990
async function getVersionsToBuild(name: string) {
9091
const versionsToBuild: string[] = []
9192
const res = await fetch(
92-
`http://localhost:${port}/api/package-history?package=${name}`
93+
`http://localhost:${port}${createPackageApiPath('package-history', name)}`
9394
)
9495
const versionInfo = (await res.json()) as Record<string, unknown>
9596

@@ -111,7 +112,10 @@ async function getVersionsToBuild(name: string) {
111112
async function buildPackage(name: string, version: string) {
112113
debug('building package %s %s', name, version)
113114
const res = await fetch(
114-
`http://localhost:${port}/api/size?package=${name + '@' + version}`
115+
`http://localhost:${port}${createPackageApiPath(
116+
'size',
117+
`${name}@${version}`
118+
)}`
115119
)
116120
debug('result %s %s %O', name, version, await res.json())
117121
}

client/api.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
PackageExportAsset,
77
PackageIdentity,
88
} from '../types/package-domain'
9+
import { createPackageApiPath } from '../utils/packageApi.utils'
910

1011
// Re-export domain types that client code imports from this module.
1112
export type { PackageBuildInfo, PackageBuildInfoSnapshot, PackageExportAsset }
@@ -124,31 +125,31 @@ export default class API {
124125

125126
static getInfo(packageString: string) {
126127
return API.get<PackageBuildInfo>(
127-
`/api/size?package=${packageString}&record=true`
128+
createPackageApiPath('size', packageString, { record: true })
128129
)
129130
}
130131

131132
static getExports(packageString: string) {
132133
return API.get<PackageExportsResponse>(
133-
`/api/exports?package=${packageString}`
134+
createPackageApiPath('exports', packageString)
134135
)
135136
}
136137

137138
static getExportsSizes(packageString: string) {
138139
return API.get<PackageExportSizesResponse>(
139-
`/api/exports-sizes?package=${packageString}`
140+
createPackageApiPath('exports-sizes', packageString)
140141
)
141142
}
142143

143144
static getDependencies(packageString: string) {
144145
return API.get<PackageDependencyInfo[]>(
145-
`/api/dependencies?package=${packageString}`
146+
createPackageApiPath('dependencies', packageString)
146147
)
147148
}
148149

149150
static getHistory(packageString: string, limit: number) {
150151
return API.get<PackageHistoryResponse>(
151-
`/api/package-history?package=${packageString}&limit=${limit}`
152+
createPackageApiPath('package-history', packageString, { limit })
152153
)
153154
}
154155

@@ -158,7 +159,7 @@ export default class API {
158159

159160
static getSimilar(packageName: string) {
160161
return API.get<SimilarPackagesResponse>(
161-
`/api/similar-packages?package=${packageName}`
162+
createPackageApiPath('similar-packages', packageName)
162163
)
163164
}
164165

index.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import invariant from 'ts-invariant'
1818
import Cache from './utils/cache.utils'
1919
import { parsePackageString } from './utils/common.utils'
2020
import firebaseUtils from './utils/firebase.utils'
21+
import { createPackageApiPath } from './utils/packageApi.utils'
2122
import logger from './server/Logger'
2223
import remoteMcpClient from './server/mcp/remoteClient'
2324

@@ -323,9 +324,7 @@ app.prepare().then(() => {
323324
try {
324325
const args = payload.arguments ?? {}
325326
const packageName =
326-
typeof args.package === 'string'
327-
? encodeURIComponent(args.package)
328-
: undefined
327+
typeof args.package === 'string' ? args.package : undefined
329328

330329
const callLocalApi = async (path: string) => {
331330
const response = await fetch(`http://127.0.0.1:${port}${path}`, {
@@ -347,7 +346,9 @@ app.prepare().then(() => {
347346
ctx.body = { error: { code: 'InvalidMcpPayload' } }
348347
return
349348
}
350-
ctx.body = await callLocalApi(`/api/size?package=${packageName}`)
349+
ctx.body = await callLocalApi(
350+
createPackageApiPath('size', packageName)
351+
)
351352
return
352353
}
353354
case 'bundlephobia.exports': {
@@ -356,7 +357,9 @@ app.prepare().then(() => {
356357
ctx.body = { error: { code: 'InvalidMcpPayload' } }
357358
return
358359
}
359-
ctx.body = await callLocalApi(`/api/exports?package=${packageName}`)
360+
ctx.body = await callLocalApi(
361+
createPackageApiPath('exports', packageName)
362+
)
360363
return
361364
}
362365
case 'bundlephobia.exportsSizes': {
@@ -366,7 +369,7 @@ app.prepare().then(() => {
366369
return
367370
}
368371
ctx.body = await callLocalApi(
369-
`/api/exports-sizes?package=${packageName}`
372+
createPackageApiPath('exports-sizes', packageName)
370373
)
371374
return
372375
}
@@ -378,7 +381,7 @@ app.prepare().then(() => {
378381
}
379382
const limit = Number(args.limit ?? 10)
380383
ctx.body = await callLocalApi(
381-
`/api/package-history?package=${packageName}&limit=${limit}`
384+
createPackageApiPath('package-history', packageName, { limit })
382385
)
383386
return
384387
}
@@ -389,7 +392,7 @@ app.prepare().then(() => {
389392
return
390393
}
391394
ctx.body = await callLocalApi(
392-
`/api/similar-packages?package=${packageName}`
395+
createPackageApiPath('similar-packages', packageName)
393396
)
394397
return
395398
}

scripts/populate-v3.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import path from 'path'
33

44
import axios from 'axios'
55

6+
import { createPackageApiPath } from '../utils/packageApi.utils'
7+
68
interface ProgressState {
79
completed: Set<string>
810
completed_exports: Set<string>
@@ -249,9 +251,10 @@ async function buildPackage(
249251
}
250252
} catch {}
251253

252-
const url = `${API_BASE}/api/size?package=${encodeURIComponent(
253-
key
254-
)}&record=true&cache=refresh`
254+
const url = `${API_BASE}${createPackageApiPath('size', key, {
255+
cacheMode: 'force-rebuild',
256+
record: true,
257+
})}`
255258

256259
try {
257260
const cancelSource = axios.CancelToken.source()
@@ -317,9 +320,9 @@ async function buildExports(
317320
}
318321
} catch {}
319322

320-
const url = `${API_BASE}/api/exports-sizes?package=${encodeURIComponent(
321-
key
322-
)}&cache=refresh`
323+
const url = `${API_BASE}${createPackageApiPath('exports-sizes', key, {
324+
cacheMode: 'force-rebuild',
325+
})}`
323326

324327
try {
325328
const cancelSource = axios.CancelToken.source()

server/middlewares/exports.middleware.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const exportsMiddleware: Middleware = async ctx => {
1818
)
1919
const { cacheMode } = ctx.state.packageRequest
2020

21-
if (cacheMode === 'only') {
21+
if (cacheMode === 'cache-only') {
2222
ctx.status = 404
2323
return
2424
}
@@ -32,7 +32,7 @@ const exportsMiddleware: Middleware = async ctx => {
3232

3333
ctx.cacheControl = {
3434
maxAge:
35-
cacheMode === 'refresh'
35+
cacheMode === 'force-rebuild'
3636
? 0
3737
: semver.valid(ctx.state.packageRequest.version ?? '')
3838
? config.CACHE.SIZE_API_HAS_VERSION

server/middlewares/exportsSizes.middleware.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const exportSizesMiddleware: Middleware = async ctx => {
3131

3232
ctx.cacheControl = {
3333
maxAge:
34-
cacheMode === 'refresh'
34+
cacheMode === 'force-rebuild'
3535
? 0
3636
: semver.valid(ctx.state.packageRequest.version ?? '')
3737
? config.CACHE.SIZE_API_HAS_VERSION
@@ -53,7 +53,7 @@ const exportSizesMiddleware: Middleware = async ctx => {
5353
`BUILD EXPORTS SIZES: ${packageString} built in ${time.toFixed()}s`
5454
)
5555

56-
if (cacheMode === 'refresh') {
56+
if (cacheMode === 'force-rebuild') {
5757
void cache.setExportsSize({ name, version }, body)
5858
}
5959
}

server/middlewares/results/blockBlacklist.middleware.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import CustomError from '../../CustomError'
88
const blockBlacklistMiddleware: Middleware = async (ctx, next) => {
99
const { cacheMode, ...requestedPackage } = ctx.state.packageRequest
1010

11-
if (cacheMode === 'refresh') {
11+
if (cacheMode === 'force-rebuild') {
1212
await next()
1313
return
1414
}

0 commit comments

Comments
 (0)