161 lines
5.4 KiB
TypeScript
161 lines
5.4 KiB
TypeScript
import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js'
|
|
import * as p from '@clack/prompts'
|
|
import { jest } from '@jest/globals'
|
|
|
|
const esmConfigs = {
|
|
defaultNextConfig: `/** @type {import('next').NextConfig} */
|
|
const nextConfig = {};
|
|
export default nextConfig;
|
|
`,
|
|
nextConfigWithFunc: `const nextConfig = {};
|
|
export default someFunc(nextConfig);
|
|
`,
|
|
nextConfigWithFuncMultiline: `const nextConfig = {};;
|
|
export default someFunc(
|
|
nextConfig
|
|
);
|
|
`,
|
|
nextConfigExportNamedDefault: `const nextConfig = {};
|
|
const wrapped = someFunc(asdf);
|
|
export { wrapped as default };
|
|
`,
|
|
nextConfigWithSpread: `const nextConfig = {
|
|
...someConfig,
|
|
};
|
|
export default nextConfig;
|
|
`,
|
|
}
|
|
|
|
const cjsConfigs = {
|
|
defaultNextConfig: `
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {};
|
|
module.exports = nextConfig;
|
|
`,
|
|
anonConfig: `module.exports = {};`,
|
|
nextConfigWithFunc: `const nextConfig = {};
|
|
module.exports = someFunc(nextConfig);
|
|
`,
|
|
nextConfigWithFuncMultiline: `const nextConfig = {};
|
|
module.exports = someFunc(
|
|
nextConfig
|
|
);
|
|
`,
|
|
nextConfigExportNamedDefault: `const nextConfig = {};
|
|
const wrapped = someFunc(asdf);
|
|
module.exports = wrapped;
|
|
`,
|
|
nextConfigWithSpread: `const nextConfig = { ...someConfig };
|
|
module.exports = nextConfig;
|
|
`,
|
|
}
|
|
|
|
describe('parseAndInsertWithPayload', () => {
|
|
describe('esm', () => {
|
|
const configType = 'esm'
|
|
const importStatement = withPayloadStatement[configType]
|
|
it('should parse the default next config', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
esmConfigs.defaultNextConfig,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(importStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload(nextConfig)')
|
|
})
|
|
it('should parse the config with a function', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
esmConfigs.nextConfigWithFunc,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))')
|
|
})
|
|
|
|
it('should parse the config with a function on a new line', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
esmConfigs.nextConfigWithFuncMultiline,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(importStatement)
|
|
expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/)
|
|
})
|
|
|
|
it('should parse the config with a spread', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
esmConfigs.nextConfigWithSpread,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(importStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload(nextConfig)')
|
|
})
|
|
|
|
// Unsupported: export { wrapped as default }
|
|
it('should give warning with a named export as default', () => {
|
|
const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {})
|
|
|
|
const { modifiedConfigContent, success } = parseAndModifyConfigContent(
|
|
esmConfigs.nextConfigExportNamedDefault,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(importStatement)
|
|
expect(success).toBe(false)
|
|
|
|
expect(warnLogSpy).toHaveBeenCalledWith(
|
|
expect.stringContaining('Could not automatically wrap'),
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('cjs', () => {
|
|
const configType = 'cjs'
|
|
const requireStatement = withPayloadStatement[configType]
|
|
it('should parse the default next config', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.defaultNextConfig,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(requireStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload(nextConfig)')
|
|
})
|
|
it('should parse anonymous default config', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.anonConfig,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(requireStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload({})')
|
|
})
|
|
it('should parse the config with a function', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.nextConfigWithFunc,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))')
|
|
})
|
|
it('should parse the config with a function on a new line', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.nextConfigWithFuncMultiline,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(requireStatement)
|
|
expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/)
|
|
})
|
|
it('should parse the config with a named export as default', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.nextConfigExportNamedDefault,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(requireStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload(wrapped)')
|
|
})
|
|
|
|
it('should parse the config with a spread', () => {
|
|
const { modifiedConfigContent } = parseAndModifyConfigContent(
|
|
cjsConfigs.nextConfigWithSpread,
|
|
configType,
|
|
)
|
|
expect(modifiedConfigContent).toContain(requireStatement)
|
|
expect(modifiedConfigContent).toContain('withPayload(nextConfig)')
|
|
})
|
|
})
|
|
})
|