Skip to content

Commit 1ac45ca

Browse files
committed
Add plugin to compile with swc (currently broken)
1 parent 3f61ffe commit 1ac45ca

File tree

4 files changed

+72
-6
lines changed

4 files changed

+72
-6
lines changed

packages/next/src/build/swc/options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function getParserOptions({ filename, jsConfig, ...rest }: any) {
2929
}
3030
}
3131

32-
function getBaseSWCOptions({
32+
export function getBaseSWCOptions({
3333
filename,
3434
jest,
3535
development,

packages/next/src/build/webpack-config.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ import { loadBindings } from './swc'
6666
import { AppBuildManifestPlugin } from './webpack/plugins/app-build-manifest-plugin'
6767
import { SubresourceIntegrityPlugin } from './webpack/plugins/subresource-integrity-plugin'
6868
import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plugin'
69+
import { ImageLoaderFilePlugin } from './webpack/plugins/image-loaderfile-plugin'
6970
import { getSupportedBrowsers } from './utils'
7071

7172
type ExcludesFalse = <T>(x: T | false) => x is T
@@ -1123,9 +1124,11 @@ export default async function getBaseWebpackConfig(
11231124

11241125
...(config.images.loaderFile
11251126
? {
1126-
'next/dist/shared/lib/image-loader': config.images.loaderFile,
1127+
'next/dist/shared/lib/image-loader-generated':
1128+
config.images.loaderFile,
11271129
...(isEdgeServer && {
1128-
'next/dist/esm/shared/lib/image-loader': config.images.loaderFile,
1130+
'next/dist/esm/shared/lib/image-loader-generated':
1131+
config.images.loaderFile,
11291132
}),
11301133
}
11311134
: undefined),
@@ -2275,6 +2278,7 @@ export default async function getBaseWebpackConfig(
22752278
].filter(Boolean),
22762279
},
22772280
plugins: [
2281+
isNodeServer && new ImageLoaderFilePlugin({ dev, config }),
22782282
dev && isClient && new ReactRefreshWebpackPlugin(webpack),
22792283
// Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4)
22802284
(isClient || isEdgeServer) &&
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import type { webpack } from 'next/dist/compiled/webpack/webpack'
2+
import { getBaseSWCOptions } from 'next/src/build/swc/options'
3+
import { readFileSync, writeFileSync, copyFileSync } from 'fs'
4+
import { dirname, join } from 'path'
5+
import { transform } from '../../swc'
6+
import type { NextConfigComplete } from '../../../server/config-shared'
7+
8+
export class ImageLoaderFilePlugin {
9+
opts: { dev: boolean; config: NextConfigComplete }
10+
11+
constructor(opts: { dev: boolean; config: NextConfigComplete }) {
12+
console.log('ImageLoaderFilePlugin constructor')
13+
this.opts = opts
14+
}
15+
16+
apply(compiler: webpack.Compiler) {
17+
console.log('ImageLoaderFilePlugin apply')
18+
compiler.hooks.beforeCompile.tapPromise(
19+
'ImageLoaderFilePlugin',
20+
async () => {
21+
console.log('ImageLoaderFilePlugin beforeCompile')
22+
const {
23+
dev,
24+
config: {
25+
images: { loaderFile },
26+
},
27+
} = this.opts
28+
const srcPath = require.resolve('next/dist/shared/lib/image-loader')
29+
const destPath = join(dirname(srcPath), 'image-loader-generated.js')
30+
if (loaderFile) {
31+
const source = readFileSync(loaderFile, 'utf8')
32+
33+
const swcOpts = getBaseSWCOptions({
34+
filename: srcPath,
35+
development: dev,
36+
hasReactRefresh: false,
37+
globalWindow: false,
38+
swcPlugins: [],
39+
compilerOptions: {},
40+
jsConfig: {},
41+
})
42+
43+
const result = await transform(source, swcOpts)
44+
45+
console.log('result from swc is', result)
46+
47+
writeFileSync(destPath, result.code)
48+
} else {
49+
copyFileSync(srcPath, destPath)
50+
}
51+
}
52+
)
53+
}
54+
}

packages/next/src/shared/lib/get-img-props.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import type {
66
ImageLoaderProps,
77
ImageLoaderPropsWithConfig,
88
} from './image-config'
9+
import { interopDefault } from '../../lib/interop-default'
910

1011
// @ts-ignore - This is replaced by webpack alias
11-
import defaultLoader from 'next/dist/shared/lib/image-loader'
12+
//import defaultLoader from 'next/dist/shared/lib/image-loader-generated'
1213

1314
export interface StaticImageData {
1415
src: string
@@ -282,7 +283,14 @@ export function getImgProps(
282283
config = { ...c, allSizes, deviceSizes }
283284
}
284285

285-
let loader: ImageLoaderWithConfig = rest.loader || defaultLoader
286+
let loader: ImageLoaderWithConfig
287+
if (rest.loader) {
288+
loader = rest.loader
289+
} else {
290+
loader = interopDefault(
291+
require('next/dist/shared/lib/image-loader-generated')
292+
)
293+
}
286294

287295
// Remove property so it's not spread on <img> element
288296
delete rest.loader
@@ -500,7 +508,7 @@ export function getImgProps(
500508
)
501509
}
502510

503-
if (!unoptimized && loader !== defaultLoader) {
511+
if (!unoptimized && !isDefaultLoader) {
504512
const urlStr = loader({
505513
config,
506514
src,

0 commit comments

Comments
 (0)