Skip to content

Commit f868c81

Browse files
committed
feat: check for forms workaround before checking for forms
1 parent 52d3ed3 commit f868c81

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

src/build/content/prerendered.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import type {
1818
NetlifyIncrementalCacheValue,
1919
} from '../../shared/cache-types.cjs'
2020
import type { PluginContext } from '../plugin-context.js'
21-
import { verifyNoNetlifyForms } from '../verification.js'
21+
import { verifyNetlifyForms } from '../verification.js'
2222

2323
const tracer = wrapTracer(trace.getTracer('Next runtime'))
2424

@@ -172,7 +172,7 @@ export const copyPrerenderedContent = async (ctx: PluginContext): Promise<void>
172172

173173
// Netlify Forms are not support and require a workaround
174174
if (value.kind === 'PAGE' || value.kind === 'APP_PAGE') {
175-
verifyNoNetlifyForms(ctx, value.html)
175+
verifyNetlifyForms(ctx, value.html)
176176
}
177177

178178
await writeCacheEntry(key, value, lastModified, ctx)

src/build/content/static.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import glob from 'fast-glob'
88

99
import { encodeBlobKey } from '../../shared/blobkey.js'
1010
import { PluginContext } from '../plugin-context.js'
11-
import { verifyNoNetlifyForms } from '../verification.js'
11+
import { verifyNetlifyForms } from '../verification.js'
1212

1313
const tracer = wrapTracer(trace.getTracer('Next runtime'))
1414

@@ -32,7 +32,7 @@ export const copyStaticContent = async (ctx: PluginContext): Promise<void> => {
3232
.filter((path) => !paths.includes(`${path.slice(0, -5)}.json`))
3333
.map(async (path): Promise<void> => {
3434
const html = await readFile(join(srcDir, path), 'utf-8')
35-
verifyNoNetlifyForms(ctx, html)
35+
verifyNetlifyForms(ctx, html)
3636
await writeFile(join(destDir, await encodeBlobKey(path)), html, 'utf-8')
3737
}),
3838
)

src/build/verification.ts

+29-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { existsSync } from 'node:fs'
2+
import { readFile } from 'node:fs/promises'
23
import { join } from 'node:path'
34

5+
import { glob } from 'fast-glob'
46
import { satisfies } from 'semver'
57

68
import { ApiRouteType, getAPIRoutesConfigs } from './advanced-api-routes.js'
79
import type { PluginContext } from './plugin-context.js'
810

911
const SUPPORTED_NEXT_VERSIONS = '>=13.5.0'
1012

11-
const warnings = new Set<string>()
13+
const verifications = new Set<string>()
1214

1315
export function verifyPublishDir(ctx: PluginContext) {
1416
if (!existsSync(ctx.publishDir)) {
@@ -71,7 +73,7 @@ export function verifyPublishDir(ctx: PluginContext) {
7173
}
7274
}
7375

74-
export async function verifyNoAdvancedAPIRoutes(ctx: PluginContext) {
76+
export async function verifyAdvancedAPIRoutes(ctx: PluginContext) {
7577
const apiRoutesConfigs = await getAPIRoutesConfigs(ctx)
7678

7779
const unsupportedAPIRoutes = apiRoutesConfigs.filter((apiRouteConfig) => {
@@ -88,11 +90,33 @@ export async function verifyNoAdvancedAPIRoutes(ctx: PluginContext) {
8890
}
8991
}
9092

91-
export function verifyNoNetlifyForms(ctx: PluginContext, html: string) {
92-
if (!warnings.has('netlifyForms') && /<form[^>]*?\s(netlify|data-netlify)[=>\s]/.test(html)) {
93+
const formDetectionRegex = /<form[^>]*?\s(netlify|data-netlify)[=>\s]/
94+
95+
export async function verifyNetlifyFormsWorkaround(ctx: PluginContext) {
96+
const srcDir = ctx.resolveFromSiteDir('public')
97+
const paths = await glob(join(srcDir, '**/*.html'))
98+
try {
99+
const hasWorkaround = await paths.some(async (path): Promise<boolean> => {
100+
const html = await readFile(path, 'utf-8')
101+
return formDetectionRegex.test(html)
102+
})
103+
if (hasWorkaround) {
104+
verifications.add('netlifyFormsWorkaround')
105+
}
106+
} catch (error) {
107+
ctx.failBuild('Failed verifying public files', error)
108+
}
109+
}
110+
111+
export function verifyNetlifyForms(ctx: PluginContext, html: string) {
112+
if (
113+
!verifications.has('netlifyForms') &&
114+
!verifications.has('netlifyFormsWorkaround') &&
115+
formDetectionRegex.test(html)
116+
) {
93117
console.warn(
94118
'@netlify/plugin-next@5 does not support Netlify Forms. Refer to https://ntl.fyi/next-runtime-forms-migration for migration example.',
95119
)
96-
warnings.add('netlifyForms')
120+
verifications.add('netlifyForms')
97121
}
98122
}

src/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import { createEdgeHandlers } from './build/functions/edge.js'
1717
import { createServerHandler } from './build/functions/server.js'
1818
import { setImageConfig } from './build/image-cdn.js'
1919
import { PluginContext } from './build/plugin-context.js'
20-
import { verifyNoAdvancedAPIRoutes, verifyPublishDir } from './build/verification.js'
20+
import {
21+
verifyAdvancedAPIRoutes,
22+
verifyNetlifyFormsWorkaround,
23+
verifyPublishDir,
24+
} from './build/verification.js'
2125

2226
const tracer = wrapTracer(trace.getTracer('Next.js runtime'))
2327

@@ -58,7 +62,8 @@ export const onBuild = async (options: NetlifyPluginOptions) => {
5862
return copyStaticExport(ctx)
5963
}
6064

61-
await verifyNoAdvancedAPIRoutes(ctx)
65+
await verifyAdvancedAPIRoutes(ctx)
66+
await verifyNetlifyFormsWorkaround(ctx)
6267

6368
await Promise.all([
6469
copyStaticAssets(ctx),

0 commit comments

Comments
 (0)