49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
export const defaultJsFileExtensions = ['js', 'mjs', 'jsx', 'ts', 'tsx']
|
|
const imageExtensions = ['jpg', 'jpeg', 'png', 'webp', 'avif']
|
|
const nextClientComponents = [
|
|
'link',
|
|
'image',
|
|
// TODO-APP: check if this affects the regex
|
|
'future/image',
|
|
'head',
|
|
'script',
|
|
'dynamic',
|
|
]
|
|
|
|
const NEXT_BUILT_IN_CLIENT_RSC_REGEX = new RegExp(
|
|
`[\\\\/]next[\\\\/](${nextClientComponents.join('|')})\\.js$`
|
|
)
|
|
|
|
export function isNextBuiltinClientComponent(resourcePath: string) {
|
|
return NEXT_BUILT_IN_CLIENT_RSC_REGEX.test(resourcePath)
|
|
}
|
|
|
|
export function buildExports(moduleExports: any, isESM: boolean) {
|
|
let ret = ''
|
|
Object.keys(moduleExports).forEach((key) => {
|
|
const exportExpression = isESM
|
|
? `export ${key === 'default' ? key : `const ${key} =`} ${
|
|
moduleExports[key]
|
|
}`
|
|
: `exports.${key} = ${moduleExports[key]}`
|
|
|
|
ret += exportExpression + '\n'
|
|
})
|
|
return ret
|
|
}
|
|
|
|
// Special cases for Next.js APIs that are considered as client components:
|
|
// - .client.[ext]
|
|
// - next built-in client components
|
|
// - .[imageExt]
|
|
export const clientComponentRegex = new RegExp(
|
|
'(' +
|
|
`\\.client(\\.(${defaultJsFileExtensions.join('|')}))?|` +
|
|
`next/(${nextClientComponents.join('|')})(\\.js)?|` +
|
|
`\\.(${imageExtensions.join('|')})` +
|
|
')$'
|
|
)
|
|
|
|
export const serverComponentRegex = new RegExp(
|
|
`\\.server(\\.(${defaultJsFileExtensions.join('|')}))?$`
|
|
)
|