Skip to content

Commit df6fcda

Browse files
authored
fix: resolve _app deps in API routes (#1738)
* fix: resolve _app deps in API routes * chore: add test
1 parent d9ba9c5 commit df6fcda

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

packages/runtime/src/helpers/functions.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,13 @@ export const generateFunctions = async (
4949
join(__dirname, '..', '..', 'lib', 'templates', 'handlerUtils.js'),
5050
join(functionsDir, functionName, 'handlerUtils.js'),
5151
)
52+
53+
const resolveSourceFile = (file: string) => join(publish, 'server', file)
54+
5255
const resolverSource = await getSinglePageResolver({
5356
functionsDir,
54-
sourceFile: join(publish, 'server', compiled),
57+
// These extra pages are always included by Next.js
58+
sourceFiles: [compiled, 'pages/_app.js', 'pages/_document.js', 'pages/_error.js'].map(resolveSourceFile),
5559
})
5660
await writeFile(join(functionsDir, functionName, 'pages.js'), resolverSource)
5761
}

packages/runtime/src/templates/getPageResolver.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@ export const getPageResolver = async ({ publish, target }: { publish: string; ta
3939
*/
4040
export const getSinglePageResolver = async ({
4141
functionsDir,
42-
sourceFile,
42+
sourceFiles,
4343
}: {
4444
functionsDir: string
45-
sourceFile: string
45+
sourceFiles: Array<string>
4646
}) => {
47-
const dependencies = await getDependenciesOfFile(sourceFile)
47+
const dependencies = await Promise.all(sourceFiles.map((sourceFile) => getDependenciesOfFile(sourceFile)))
4848
// We don't need the actual name, just the relative path.
4949
const functionDir = resolve(functionsDir, 'functionName')
5050

51-
const pageFiles = [sourceFile, ...dependencies]
51+
const deduped = [...new Set(dependencies.flat())]
52+
53+
const pageFiles = [...sourceFiles, ...deduped]
5254
.map((file) => `require.resolve('${relative(functionDir, file)}')`)
5355
.sort()
5456

test/__snapshots__/index.js.snap

+31-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`onBuild() generates a file referencing all page sources 1`] = `
3+
exports[`onBuild() generates a file referencing all API route sources 1`] = `
44
"// This file is purely to allow nft to know about these pages. It should be temporary.
55
exports.resolvePages = () => {
66
try {
@@ -38,7 +38,7 @@ exports.resolvePages = () => {
3838
}"
3939
`;
4040

41-
exports[`onBuild() generates a file referencing all page sources 2`] = `
41+
exports[`onBuild() generates a file referencing all API route sources 2`] = `
4242
"// This file is purely to allow nft to know about these pages. It should be temporary.
4343
exports.resolvePages = () => {
4444
try {
@@ -76,6 +76,35 @@ exports.resolvePages = () => {
7676
}"
7777
`;
7878

79+
exports[`onBuild() generates a file referencing all page sources: for _api_hello-background-background 1`] = `
80+
"// This file is purely to allow nft to know about these pages.
81+
try {
82+
require.resolve('../../../.next/server/package.json')
83+
require.resolve('../../../.next/server/pages/_app.js')
84+
require.resolve('../../../.next/server/pages/_document.js')
85+
require.resolve('../../../.next/server/pages/_error.js')
86+
require.resolve('../../../.next/server/pages/api/hello-background.js')
87+
require.resolve('../../../.next/server/pages/chunks/274.js')
88+
require.resolve('../../../.next/server/pages/webpack-api-runtime.js')
89+
require.resolve('../../../.next/server/pages/webpack-runtime.js')
90+
} catch {}"
91+
`;
92+
93+
exports[`onBuild() generates a file referencing all page sources: for _api_hello-scheduled-handler 1`] = `
94+
"// This file is purely to allow nft to know about these pages.
95+
try {
96+
require.resolve('../../../.next/package.json')
97+
require.resolve('../../../.next/server/package.json')
98+
require.resolve('../../../.next/server/pages/_app.js')
99+
require.resolve('../../../.next/server/pages/_document.js')
100+
require.resolve('../../../.next/server/pages/_error.js')
101+
require.resolve('../../../.next/server/pages/api/hello-scheduled.js')
102+
require.resolve('../../../.next/server/pages/chunks/274.js')
103+
require.resolve('../../../.next/server/pages/webpack-api-runtime.js')
104+
require.resolve('../../../.next/server/pages/webpack-runtime.js')
105+
} catch {}"
106+
`;
107+
79108
exports[`onBuild() generates a file referencing all when publish dir is a subdirectory 1`] = `
80109
"// This file is purely to allow nft to know about these pages. It should be temporary.
81110
exports.resolvePages = () => {

test/index.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,18 @@ describe('onBuild()', () => {
533533
expect(netlifyConfig.functions[ODB_FUNCTION_NAME].node_bundler).toEqual('nft')
534534
})
535535

536-
test('generates a file referencing all page sources', async () => {
536+
it('generates a file referencing all page sources', async () => {
537+
await moveNextDist()
538+
await nextRuntime.onBuild(defaultArgs)
539+
540+
for (const route of ['_api_hello-background-background', '_api_hello-scheduled-handler']) {
541+
const expected = path.resolve(constants.INTERNAL_FUNCTIONS_SRC, route, 'pages.js')
542+
expect(existsSync(expected)).toBeTruthy()
543+
expect(readFileSync(expected, 'utf8')).toMatchSnapshot(`for ${route}`)
544+
}
545+
})
546+
547+
test('generates a file referencing all API route sources', async () => {
537548
await moveNextDist()
538549
await nextRuntime.onBuild(defaultArgs)
539550
const handlerPagesFile = path.join(constants.INTERNAL_FUNCTIONS_SRC, HANDLER_FUNCTION_NAME, 'pages.js')

0 commit comments

Comments
 (0)