Skip to content

Commit a31816e

Browse files
authoredNov 28, 2023
feat: swap publish/static dirs (#93)
* feat: swap publish/static dirs * fix: move redirects to onPostBuild * chore: add test for static assets * chore: fix e2e test
1 parent f462438 commit a31816e

File tree

6 files changed

+48
-13
lines changed

6 files changed

+48
-13
lines changed
 

‎src/build/config.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { NetlifyPluginConstants, NetlifyPluginOptions } from '@netlify/buil
22
import type { PrerenderManifest } from 'next/dist/build/index.js'
33
import { readFile } from 'node:fs/promises'
44
import { resolve } from 'node:path'
5-
import { SERVER_HANDLER_NAME, STATIC_DIR } from './constants.js'
5+
import { SERVER_HANDLER_NAME } from './constants.js'
66

77
export const getPrerenderManifest = async ({
88
PUBLISH_DIR,
@@ -13,12 +13,13 @@ export const getPrerenderManifest = async ({
1313
/**
1414
* Enable Next.js standalone mode at build time
1515
*/
16-
export const setBuildConfig = () => {
16+
export const setPreBuildConfig = () => {
1717
process.env.NEXT_PRIVATE_STANDALONE = 'true'
1818
}
1919

20-
export const setDeployConfig = ({ netlifyConfig }: Pick<NetlifyPluginOptions, 'netlifyConfig'>) => {
21-
netlifyConfig.build.publish = STATIC_DIR
20+
export const setPostBuildConfig = ({
21+
netlifyConfig,
22+
}: Pick<NetlifyPluginOptions, 'netlifyConfig'>) => {
2223
netlifyConfig.redirects ||= []
2324
netlifyConfig.redirects.push({
2425
from: '/*',

‎src/build/constants.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const PLUGIN_NAME = pkg.name
1111
export const PLUGIN_VERSION = pkg.version
1212

1313
export const STATIC_DIR = '.netlify/static'
14+
export const TEMP_DIR = '.netlify/temp'
1415

1516
export const SERVER_FUNCTIONS_DIR = '.netlify/functions-internal'
1617
export const SERVER_HANDLER_NAME = '_netlify-server-handler'

‎src/build/content/static.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import type { NetlifyPluginOptions } from '@netlify/build'
22
import glob from 'fast-glob'
33
import type { PrerenderManifest } from 'next/dist/build/index.js'
44
import { existsSync } from 'node:fs'
5-
import { cp, readFile, rm } from 'node:fs/promises'
5+
import { cp, mkdir, readFile, rename, rm } from 'node:fs/promises'
66
import { basename, dirname, resolve } from 'node:path'
77
import { join as joinPosix } from 'node:path/posix'
88
import { getBlobStore } from '../blob.js'
99
import { getPrerenderManifest } from '../config.js'
10-
import { STATIC_DIR } from '../constants.js'
10+
import { STATIC_DIR, TEMP_DIR } from '../constants.js'
1111

1212
export const uploadStaticContent = async ({
1313
constants: { PUBLISH_DIR, NETLIFY_API_TOKEN, NETLIFY_API_HOST, SITE_ID },
@@ -63,3 +63,18 @@ export const copyStaticAssets = async ({
6363
})
6464
}
6565
}
66+
67+
export const publishStaticDir = async ({
68+
constants: { PUBLISH_DIR },
69+
}: Pick<NetlifyPluginOptions, 'constants'>): Promise<void> => {
70+
await mkdir(resolve(TEMP_DIR, 'publish'), { recursive: true })
71+
await rename(resolve(PUBLISH_DIR), resolve(TEMP_DIR, 'publish'))
72+
await rename(resolve(STATIC_DIR), resolve(PUBLISH_DIR))
73+
}
74+
75+
export const unpublishStaticDir = async ({
76+
constants: { PUBLISH_DIR },
77+
}: Pick<NetlifyPluginOptions, 'constants'>): Promise<void> => {
78+
await rename(resolve(PUBLISH_DIR), resolve(STATIC_DIR))
79+
await rename(resolve(TEMP_DIR, 'publish'), resolve(PUBLISH_DIR))
80+
}

‎src/index.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import type { NetlifyPluginOptions } from '@netlify/build'
22
import { restoreBuildCache, saveBuildCache } from './build/cache.js'
3-
import { setBuildConfig, setDeployConfig } from './build/config.js'
3+
import { setPostBuildConfig, setPreBuildConfig } from './build/config.js'
44
import { uploadPrerenderedContent } from './build/content/prerendered.js'
5-
import { copyStaticAssets, uploadStaticContent } from './build/content/static.js'
5+
import {
6+
copyStaticAssets,
7+
publishStaticDir,
8+
unpublishStaticDir,
9+
uploadStaticContent,
10+
} from './build/content/static.js'
611
import { createServerHandler } from './build/functions/server.js'
712

813
export const onPreBuild = async ({ constants, utils }: NetlifyPluginOptions) => {
14+
setPreBuildConfig()
915
await restoreBuildCache({ constants, utils })
10-
setBuildConfig()
1116
}
1217

1318
export const onBuild = async ({ constants, utils }: NetlifyPluginOptions) => {
@@ -22,6 +27,11 @@ export const onBuild = async ({ constants, utils }: NetlifyPluginOptions) => {
2227
])
2328
}
2429

25-
export const onPostBuild = ({ netlifyConfig }: NetlifyPluginOptions) => {
26-
setDeployConfig({ netlifyConfig })
30+
export const onPostBuild = async ({ constants, netlifyConfig }: NetlifyPluginOptions) => {
31+
setPostBuildConfig({ netlifyConfig })
32+
await publishStaticDir({ constants })
33+
}
34+
35+
export const onEnd = async ({ constants }: NetlifyPluginOptions) => {
36+
await unpublishStaticDir({ constants })
2737
}

‎tests/e2e/simple-app.test.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { test, expect } from '@playwright/test'
1+
import { expect, test } from '@playwright/test'
22
import { createE2EFixture } from '../utils/create-e2e-fixture.js'
33

44
let ctx: Awaited<ReturnType<typeof createE2EFixture>>
@@ -17,7 +17,14 @@ test.describe('simple-next-app', () => {
1717

1818
await expect(page).toHaveTitle('Simple Next App')
1919

20-
const h1 = await page.locator('h1')
20+
const h1 = page.locator('h1')
2121
await expect(h1).toHaveText('Home')
2222
})
23+
24+
test('Serves a static image correctly', async ({ page }) => {
25+
const response = await page.goto(`${ctx.url}/next.svg`)
26+
27+
expect(response?.status()).toBe(200)
28+
expect(response?.headers()['content-type']).toBe('image/svg+xml')
29+
})
2330
})
Loading

0 commit comments

Comments
 (0)
Please sign in to comment.